2013-02-28 2 views
1

간단한 쿼리가 있지만 필터링 할 필요가있는 여러 레코드가 있습니다. 나는 와일드 카드와 같은 문장을 사용하고있다. 더 나은 방법이 있나요? 내가 참조 할 수있는 udf 테이블을 만들 수 있습니까? 방법? 만약 내가 할 수 있다면. 감사합니다 :)유사 SQL 문 SQL Server 2008R2

SELECT a.SalesOrderNo , 
     a.ShipExpireDate , 
     a.CustomerNo , 
     b.ItemCode , 
     b.LineKey , 
     b.QuantityOrdered , 
     b.QuantityShipped , 
     b.ItemCodeDesc , 
     b.ExplodedKitItem 
FROM dbo.SO_SalesOrderHeader a 
LEFT JOIN dbo.SO_SalesOrderDetail b 
ON a.SalesOrderNo = b.SalesOrderNo 
WHERE b.ItemType = '1' 
    AND b.ItemCodeDesc NOT LIKE '%Cert%' 
    AND b.ItemCodeDesc NOT LIKE '%Fee%' 
    AND b.ItemCodeDesc NOT LIKE '%Tag%' 
    AND b.ItemCode NOT LIKE 'GF%' 
    AND b.ItemCode NOT LIKE 'PXDIALPREP' 
    AND b.ItemCode NOT LIKE '/C%' 
    AND a.ShipExpireDate = CONVERT(DATE, GETDATE(), 101) 
+1

별칭이 'a'와'b '인 이유를 설명 할 수 있습니까? 'h' ('header')와'd' ('detail')가 10,000,000 % 더 의미가 없습니까? –

+1

또한 스타일 번호가있는 DATE로 변환하는 것은 의미가 없습니다. 오늘'ShipExpireDate' 값이 언제든지 만료되도록하려면'CONVERT (DATE, ShipExpireDate) = CONVERT (DATE, GETDATE()) '를 사용하십시오. 일반적으로 열에 'CONVERT'를 적용하는 것은 현명하지 않지만 여전히 유익한 경우입니다 (즉, 해당 열에 색인이있는 경우 해당 열을 계속 사용함). –

+0

예 h와 d가 훨씬 더 의미가 있습니다. 나는 지금부터 그것을 사용할 것이다. – datacrunch

답변

0

참고 : 나는 당신의 기준은 사용자의 요구 사항에 따라 조정 (수수료 등)에 배송 할 수 없습니다 항목 유형을 필터링하기위한 것입니다 추측하고있다.

발생하는 문제는 개별 값이 ID에 저장되어있는 결과입니다. IsShippable 열이 있어야하거나, Cert, Fee, Tag 등의 행과 IsShippable 열이있는 ItemCodeType의 코드 테이블이 있어야합니다. 에 :

Id | Name | IsShippable 
1 Cert 0 
2 Fee  0 
3 Tag  0 
4 Product 1 
5 Book 1 

편집 : 당신은 코드 테이블이 있다면 당신은

inner join ItemCodeTypes ict on ict.ItemCodeTypeId = b.ItemCodeTypeId and ict.IsShippable = 1 

CERT는, 요금, 태그의 ItemCodeTypes 테이블에서 행했을 IsShippable = 0을 할 수있을 것

Select CASE 
    When b.ItemCodeDesc LIKE '%Cert%' Then 0 
    When b.ItemCodeDesc LIKE '%Fee%' Then 0 
--etc. 
    Else 1 
END as IsShippable 
,* 
From dbo.SO_SalesOrderDetail 
+0

감사합니다 everyones 빠른 응답. – datacrunch

1

다음은 다르다 : 더 직접적으로이 같은 전망을, 당신은 그것에서 쿼리 할 때 다음 쉽게 IsShippable = 1이 어디를 필터링 할 수, 귀하의 질문에 대답 디자인을 통해 ItemCodeDesc를 별도의 테이블에 넣을 수 있습니다 (TVF 일 수도 있음). 성능에 대해서는 언급 할 수 없습니다.

다른 메모에서 판매 주문 세부 정보에 외부 조인을했기 때문에이 테이블에 NULL 레코드가있을 수 있습니다. ItemType이 NULL 일 때 b.ItemType = '1'은 항상 FALSE가됩니다. 따라서 내부 조인을 할 수도 있습니다. 어쨌든 쿼리 계획이이를 수행하고 있음을 알 수 있습니다.

SELECT a.SalesOrderNo , 
    a.ShipExpireDate , 
    a.CustomerNo , 
    b.ItemCode , 
    b.LineKey , 
    b.QuantityOrdered , 
    b.QuantityShipped , 
    b.ItemCodeDesc , 
    b.ExplodedKitItem 
    FROM dbo.SO_SalesOrderHeader a 
    LEFT JOIN dbo.SO_SalesOrderDetail b 
    ON a.SalesOrderNo = b.SalesOrderNo 
    WHERE b.ItemType = '1' 
    AND b.ItemCode NOT LIKE 'GF%' 
    AND b.ItemCode NOT LIKE 'PXDIALPREP' 
    AND b.ItemCode NOT LIKE '/C%' 
    AND a.ShipExpireDate = CONVERT(DATE, GETDATE(), 101) 
    AND NOT EXISTS (
     SELECT 1 FROM dbo.MappingTable MT 
     WHERE b.ItemCodeDesc LIKE MT.ItemCodeDesc 
     ) 
+1

+1 이것은 외부 조인이 아니라 내부 조인이라는 관찰을 위해 +1합니다. –