SQL连接表和基于比较的过滤器

时间:2016-10-20 22:36:28

标签: sql sql-server sql-server-2014

我有一个查询,如果我将我的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不等于TMRebate来过滤我的结果,但我仍然希望返回没有ITMSHNAM的任何行

比较是等效的,因为任何lineItems.ITEMNMBR比较都会进行gpItems.ITMSHNAM次比较,但就像我说的那样,那些ITEMNMBR可能会发生变化。

如果我使用ISSUE COMPARISON 1并注释掉第二个比较,它会得到我想要的行数1265的结果,但是,由于上面的推理,我想使用{{ 1}}比较以过滤结果。但是,当我使用gpItems时,我的行数会降至ISSUE COMPARISON 2。我查看了哪些项目被排除在外,似乎它排除了没有1255的任何值。

如何修复TIMSHNAM比较以返回所需的gpItems行?

1 个答案:

答案 0 :(得分:1)

尝试在约束中添加一个条件,以允许返回>=为空的行。

变化:

gpItems.ITMSHNAM

对此:

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