完全外部联接不显示不匹配的行-SQL

时间:2019-06-11 00:04:04

标签: tsql join outer-join full-outer-join

我试图对两个表进行完全外部联接,使它们与表1的“ PO产品代码”和表2的“产品代码”匹配。每次尝试执行此操作时,都会有一些产品遗漏的代码:

CABSCABS0000, DOORINTD0015, FLORCARP0001, EXCL0001, and FLORTILE0000

每个产品代码均在表2中,但不在表1中。

以下是我正在使用的表格的屏幕截图。

https://i.imgur.com/pFAfrAb.png

https://i.imgur.com/k0a3o57.png

这是我尝试过的代码:

SELECT cost.[Actual Close]
    ,cost.[Project Name]
    ,cost.[Lot]
    ,cost.[Model]
    ,cost.[Elev]
    ,cost.[PO Product Code]
    ,cost.[Invoiced + Open] AS 'Invoiced + Open'
    ,rev.[Gross Sale] AS 'Gross Sale'

FROM Table1 cost FULL OUTER JOIN
     Table2 rev
    ON rev.[Product Code] = cost.[PO Product Code]  
WHERE rev.[Project Name] = cost.[Project Name] AND 
      rev.[Lot] = cost.[Lot];

我还必须提到,产品代码特定于每个项目名称和批次,这就是为什么将其添加到“ WHERE”子句中的原因。

这是我得到的输出,缺少上面列出的5个工艺代码。

https://i.imgur.com/EoMFc9v.png

2 个答案:

答案 0 :(得分:1)

false的列中的FULL JOIN值在两个表中都不匹配的行中返回。您的NULL子句将这些过滤掉-因为WHERE比较几乎永远不会算作“真”(NULLIS NULL安全比较除外)。

您想要做的就是将这些条件移到NULL子句中。无论如何,这就是它们所属的位置,因为它们实际上是ON个条件:

JOIN

答案 1 :(得分:0)

这是因为您的where子句

rev.[Project Name] = cost.[Project Name]
AND rev.[Lot] = cost.[Lot];

由于您提到的那些项不在table A中,而是在table B中,因此您基本上是通过WHERE子句删除它们的。

如果要显示这5个项目,请尝试删除where子句,然后再次运行查询。