私は条件を変更して後でどこで結果が得られるのか、結果が異なる理由とその理由について説明したいと思います他のものと比較して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
テーブルのすべてのITEMNMBR
がgpItems
テーブルにあるわけではありません。 ITEMNMBR
列は多少あいまいで変更されることがあります。だからITMSHNAM
に基づく結果をTM
またはRebate
にフィルタリングしたいのですが、まだITMSHNAM
のない行を返したいと思います。 lineItems.ITEMNMBR
比較のいずれかが常にそれらのgpItems.ITMSHNAM
比較を持つことになりますので
比較は、同等ですが、私が言ったように、これらのITEMNMBR
sが変更される場合があります。
私はISSUE COMPARISON 1
を使用して、それは私に1265
の行数を持つ私が望む結果を得る第2の比較をコメントアウトした場合は、しかし、上記の理由により、私は結果をフィルタリングするgpItems
比較を使用します。しかし、ISSUE COMPARISON 2
を使用すると、ローカウントは1255
になります。どのアイテムが除外されているかを見てみましたが、TIMSHNAM
がない値は除外されているようです。
gpItems
の比較を修正して、必要な1265
行を返すにはどうすればよいですか?
おかげで、これは動作します。完全性のために、同じ結果を達成する別の方法がありますか? – Adjit