주문 목록을 받고 특정 접두사로 시작하는지 확인합니다 (예 : OrderNumber가 표시보다 ABC로 시작하지 않는 경우). 오류로 사용자에게 주문 목록. 우리는 존재를 사용하여 첫 번째 존재를 검색하고 성능 시간을 많이 소비하고 싶지 않습니다. 존재하지 않으면 코드에서 다른 작업을 수행 할 수 있습니다.
어쨌든 SQL에서 제거 할 수 있습니까? 코드를 더 효율적으로 만들기 위해 여러 테이블에서 이와 같은 많은 검사를 수행했습니다.
if exists ( select * from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" ) begin select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" end else
답변
안타깝게도 반복되는 코드를 방지하려고하면 더 많은 코드를 작성하고 쿼리를 읽기 어렵게 만들 수 있습니다. 그러나 나는 이것이 당신에게 유리할 수 있다고 믿습니다. 테스트에서 하나 또는 두 개의 테이블에서만 검색해야하는 상황을 고려하십시오. 모든 세부 정보를 검색하려면 여러 테이블에 조인해야합니다. 이러한 상황에서 테스트 쿼리를 단순화하여 실행 속도를 높일 수 있습니다.
그리고 우리가 작업하는 동안 WHERE 문을 변경하는 것도 고려할 수 있습니다. 술어에서 함수를 사용하면 SARG 가능하지 않으며 이러한 경우 인덱스 사용을 방지합니다. 이 예에서 더 나은 접근 방식은 최적화 프로그램이
iv id = “라인을 따라 무언가로의 변환을 수행하므로
WHERE OrderNumber LIKE "ABC%"
를 확인하는 것입니다. 9dcb6bb340 “>
인덱스 사용을 지원합니다. 따라서 이것은 Index Scan (left () 사용) 대 Index Seek (LIKE 사용)입니다.
Answer
안타깝게도 다양한 이유 (레거시뿐만 아니라) SQL에는 대부분의 클라이언트 언어에있는 거의 모든 코드 재사용 옵션 및 기능이 없으며 일부 (예 : 스칼라 UDF)에는 심각한 문제가 있습니다. 따라서 효과적인 SQL 프로그래머가 되려면 C #, VB와 같은 클라이언트 언어에서 고려할 수있는 것보다 훨씬 더 많은 잘라 내기 및 붙여 넣기 코드 재사용을 수행해야합니다. Net 또는 Java.
즉, 예제에서 중복성을 제거 할 수 있지만 실제로 더 나은지 여부에 관계없이 결정해야합니다.
Declare @OrderErrorList Table(OrderNumber varchar(32)); Insert into @OrderErrorList select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC"; if exists ( select * from @OrderErrorList ) begin select * from @OrderErrorList end else
댓글
- 존재하는 대신 @@ ROWCOUNT를 확인하여 더 단순화 할 수 있습니까?
- @mathewb 예, 그러나 INSERT..SELECT 직후에 수행해야합니다. 다른 진술을 추가하면 갑자기 제대로 작동하지 않으며 내 답변에서 그런 지뢰를 피하려고합니다. 해결 방법은 @@ ROWCOUNT를 변수에 저장하는 것이지만 위에있는 것보다 훨씬 낫지는 않습니다.
Answer
반복 코드를 제거 할 수있는 SQL이 있습니까?
아니요. IF 문없이 다음과 같이 쿼리를 재구성 할 수 있지만 현재 가지고있는 것과 크게 다르지 않습니다.
SELECT * FROM dbo.OrdersImport o WHERE LEFT(OrderNumber, 3) <> "ABC" AND EXISTS ( SELECT * FROM dbo.OrdersImport WHERE LEFT(OrderNumber,3) <> "ABC" AND ID = o.ID )