2016-10-20 10 views
0

私は条件を変更して後でどこで結果が得られるのか、結果が異なる理由とその理由について説明したいと思います他のものと比較して1つを得る。SQL結合テーブルと比較に基づくフィルタ

SELECT * FROM 
    (SELECT 
      tHeader.SOPNUMBE AS [Invoice Number], 
      tHeader.ACTLSHIP AS [Invoice Date], 
      tHeader.CUSTNMBR, 
      tHeader.CUSTNAME, 
      tHeader.SLPRSNID 

      FROM METRO.dbo.SOP30200 tHeader 
      WHERE 
       MONTH(ACTLSHIP) = 6 
       AND YEAR(ACTLSHIP) = 2016 
       AND SOPNUMBE like 'I%') header 
    JOIN 
     (SELECT * 
      FROM METRO.dbo.SOP30300 
      WHERE CSLSINDX = 137 
     ) lineItems 
     on 
      lineItems.SOPNUMBE = header.[Invoice Number] 
      /* ISSUE COMPARISON 1 --- Returns 1265 rows --- 
      AND lineItems.ITEMNMBR NOT LIKE '%ENVISION%' 
      AND lineItems.ITEMNMBR NOT LIKE '%REBATE%' 
      AND lineItems.ITEMNMBR NOT LIKE '%EPSON%'*/ 
    LEFT JOIN 
     (SELECT 
      cogs.ITEMNMBR, 
      cogs.ITMSHNAM 
      FROM METRO.dbo.IV00101 cogs 
      WHERE 
       cogs.IVCOGSIX = 137 
     ) gpItems 
     on gpItems.ITEMNMBR = lineItems.ITEMNMBR 
     /* ISSUE COMPARISON 2 --- Returns 1255 rows ---*/ 
     WHERE 
      gpItems.ITMSHNAM <> 'TM' 
      AND gpItems.ITMSHNAM <> 'Rebate' 
ORDER BY SOPNUMBE 

だから、これを簡単に説明 - 私は、彼らがITEMNMBR列を持っているlineItemsテーブルから取得する任意の行。 gpItemsテーブルのその列に関連付けられているのはITMSHNAMであり、lineItemsテーブルのすべてのITEMNMBRgpItemsテーブルにあるわけではありません。 ITEMNMBR列は多少あいまいで変更されることがあります。だからITMSHNAMに基づく結果をTMまたはRebateにフィルタリングしたいのですが、まだITMSHNAMのない行を返したいと思います。 lineItems.ITEMNMBR比較のいずれかが常にそれらのgpItems.ITMSHNAM比較を持つことになりますので

比較は、同等ですが、私が言ったように、これらのITEMNMBR sが変更される場合があります。

私はISSUE COMPARISON 1を使用して、それは私に1265の行数を持つ私が望む結果を得る第2の比較をコメントアウトした場合は、しかし、上記の理由により、私は結果をフィルタリングするgpItems比較を使用します。しかし、ISSUE COMPARISON 2を使用すると、ローカウントは1255になります。どのアイテムが除外されているかを見てみましたが、TIMSHNAMがない値は除外されているようです。

gpItemsの比較を修正して、必要な1265行を返すにはどうすればよいですか?

答えて

1

制約に条件を1つ追加して、gpItems.ITMSHNAMがnullの行を返すようにしてください。

変更:これに

WHERE 
    gpItems.ITMSHNAM <> 'TM' 
    AND gpItems.ITMSHNAM <> 'Rebate' 

WHERE 
    gpItems.ITMSHNAM NOT IN ('TM', 'Rebate') 
    OR gpItems.ITMSHNAM IS NULL 
+0

おかげで、これは動作します。完全性のために、同じ結果を達成する別の方法がありますか? – Adjit

関連する問題