我有一个查询,如果我将我的on条件更改为稍后在查询中的位置,我得到不同的结果,并且只想解释为什么结果不同以及如何获得一个与另一个。
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
快速解释一下 - 我从lineItems
表中获得的任何行都有ITEMNMBR
列。与gpItems
表中的该列相关联的是ITMSHNAM
,并且ITEMNMBR
表中的每个lineItems
都不在gpItems
表中。 ITEMNMBR
列有点过于模糊,可能会发生变化。所以我想基于ITMSHNAM
不等于TM
或Rebate
来过滤我的结果,但我仍然希望返回没有ITMSHNAM
的任何行
比较是等效的,因为任何lineItems.ITEMNMBR
比较都会进行gpItems.ITMSHNAM
次比较,但就像我说的那样,那些ITEMNMBR
可能会发生变化。
如果我使用ISSUE COMPARISON 1
并注释掉第二个比较,它会得到我想要的行数1265
的结果,但是,由于上面的推理,我想使用{{ 1}}比较以过滤结果。但是,当我使用gpItems
时,我的行数会降至ISSUE COMPARISON 2
。我查看了哪些项目被排除在外,似乎它排除了没有1255
的任何值。
如何修复TIMSHNAM
比较以返回所需的gpItems
行?
答案 0 :(得分:1)
尝试在约束中添加一个条件,以允许返回>=
为空的行。
变化:
gpItems.ITMSHNAM
对此:
WHERE
gpItems.ITMSHNAM <> 'TM'
AND gpItems.ITMSHNAM <> 'Rebate'