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

Posted

技术标签:

【中文标题】完全外连接不显示不匹配的行 - SQL【英文标题】:Full outer join not showing unmatched rows - SQL 【发布时间】:2019-10-25 08:29:33 【问题描述】:

我正在尝试对两个表进行完全外部联接,将它们与表 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

【问题讨论】:

Left Outer Join doesn't return all rows from my left table?的可能重复 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)请use text, not images/links, for text--including tables & ERDs. 仅将图像用于无法表示为文本或增强文本的内容。无法搜索或剪切和粘贴图像。 了解 FULL JOIN ON 返回的内容:INNER JOIN ON rows UNION ALL 不匹配的左右表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 要求在 OUTER JOIN ON 后从表中删除由 NULL 扩展的任何行,即只保留 LEFT/RIGHT/INNER JOIN ON 行,因此右/左/两个表列不为 NULL,即“将外部联接变为内部联接”。你有那个。 【参考方案1】:

FULL JOIN 在任何一个表中都不匹配的行的列中返回 NULL 值。您的 WHERE 子句将这些过滤掉——因为 NULL 比较几乎从不会评估为“真”(IS NULLNULL-safe 比较除外)。

您要做的是将这些条件移至ON 子句。无论如何,这就是它们所属的地方,因为它们确实是JOIN 条件:

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

【讨论】:

我刚刚尝试过,但它似乎仍然遗漏了 5 个产品代码。也许在简化问题的过程中我遗漏了一些重要信息。在表 1 和表 2 中,多行具有相同的产品代码,但具有不同的“项目名称”和“批号”。这些行只是被隐藏了,因为我将结果过滤为特定的“项目名称”和“批号”。你能想到我可能仍然有这个问题的任何原因吗?任何事情都会有所帮助。谢谢。【参考方案2】:

因为你的 where 子句

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

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

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

【讨论】:

。 .解决方案是什么? @GordonLinoff 这个问题没有给出一个连贯的规范,甚至没有一个连贯的问题,那么如何才能给出不是猜测的代码呢?标题提到“不显示不匹配的行”&这个答案解决了这个问题。虽然很差。 你没有解释“因为”或“因为”——“你提到的那些项目不在表 A 但在表 B”意味着“你基本上是通过WHERE 子句”。后者也没有任何意义。一个“基本上”或“基本上”或“换句话说”,它没有介绍或总结你也给出的清晰、准确和完整的描述,只是意味着“不清楚”。 (比较我对这个问题的(简洁)评论。) @philipxy,所以还不清楚吗?我用了“因为”然后放代码以便我可以指出 where 子句,然后“你提到的那些项目不在表 A 中但在表 B 中”基本上是 table B 中的项目但是是不在table A...谢谢你的意见,如果你不介意我问,我该如何改进我的答案? 关于“如何改进我的答案?”用小步骤解释 X 暗示 Y 的原因。用“基本上”的句子替换句子。阅读你的答案,看看你实际写了什么。重读我的上一条评论关于您的“自从……”句子的内容。 PS我不明白你为什么写“所以还不清楚?”当我刚刚说不清楚并说您在评论中重复的原因或原因时,我刚才说的部分答案尚不清楚。 PS您显然认为自己不够清楚,因为您将“基本上”卡在一个句子中而不是说清楚。

以上是关于完全外连接不显示不匹配的行 - SQL的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer连接查询JION

SQL中的左连接与右连接,内连接有啥区别

SQL:完全外连接不起作用[重复]

左外连接和右外连接的区别

Mysql的内连接,外链接,交叉链接

SQL中内连接和外连接的区别