完全外连接不显示不匹配的行 - 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 NULL
和 NULL
-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的主要内容,如果未能解决你的问题,请参考以下文章