Oracle 完全联接中的重复项 [重复]
Posted
技术标签:
【中文标题】Oracle 完全联接中的重复项 [重复]【英文标题】:Duplicates in Oracle Full Join [duplicate] 【发布时间】:2021-01-16 18:32:45 【问题描述】:我阅读了this 关于完全连接工作的文章。
文章说Full Join
结合了Left Join
和Right Join
的结果,“保留重复行”。因此,为了模拟 FULL JOIN,我们使用UNION ALL
而不是UNION
。
但是,当我在 Oracle 中的两个表上执行 FULL JOIN
时,我根本找不到重复项。 (我相信,Oracle 在内部使用左连接和右连接上的“UNION ALL”操作来执行 FULL JOIN。)左连接和右连接包含一些共同的行,但是当我运行完全连接时,那些共同的行不会出现两次。
左连接的结果:
SELECT * FROM ORDERS LEFT JOIN CUSTOMER ON ORDERS.CUSTOMERID = CUSTOMER.CUSTOMER_ID;
右连接结果:
SELECT * FROM ORDERS RIGHT JOIN CUSTOMER ON ORDERS.CUSTOMERID = CUSTOMER.CUSTOMER_ID;
完全加入的结果:
SELECT * FROM CUSTOMER FULL OUTER JOIN ORDERS ON CUSTOMER.CUSTOMER_ID = ORDERS.CUSTOMERID;
从FULL JOIN
的结果可以看出,“不包含重复行”,即使左连接和右连接有一些共同的行。
那么,为什么认为完全连接包含重复行?我错过了什么吗?
【问题讨论】:
这能回答你的问题吗? What is the difference between "INNER JOIN" and "OUTER JOIN"?当心,接受的答案和几乎所有的答案都很差。 在重复链接中查看 my answer。在考虑询问之前,请阅读权威文档,如研究手册。当您获得出乎意料的结果时,请准确说出您的预期和原因,并提供参考权威文档的理由。对于代码问题,请发送minimal reproducible example。这不清楚,您没有解释“重复行”或问题。您链接的文章也不清楚,它没有清楚地说明输出是输入的函数。 (你为什么这么认为?)(修辞。) 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。 您误读了这篇文章。它并不是说完全外连接保留重复的行。这篇文章说,如果你想模拟一个完整的外连接与一个左连接和一个右连接(或两个左连接与表反转)你必须使用UNION
而不是UNION ALL
。这样做的原因是您要合并的两个查询结果可以有共同的行(这些都是与外部连接行相反的匹配项)。 UNION ALL
因此会导致重复,而 UNION
不会。
考虑将您的问题编辑为最好的——避免更多的反对票、获得赞成票、删除反对票、为未来的读者留下更好的东西、提高您的写作技巧。接收不佳的问题计入提问限制(无论是否删除)。
【参考方案1】:
你所说的“重复行”是什么意思,我真的有点困惑。连接不会产生“重复”。他们所做的是将所有行组合与匹配的join
键包含在内。
在您的情况下,customerid = 3
被重复,因此它似乎在一个或两个表中重复。在您的所有 join
查询中都是如此。
如果您的数据结构正确,那么orders.customerid
应该始终匹配customers.customerid
,除非前者是NULL
。在结构合理的数据库中,full join
非常非常少需要。例如,假设customerid
具有正确声明的外键关系,那么您将需要left join
,将customers
作为第一个表:
SELECT *
FROM CUSTOMERS c LEFT JOIN
ORDERS o
USING (CUSTOMERID);
对于USING
,CUSTOMERID
在结果集中只出现一次。
【讨论】:
以上是关于Oracle 完全联接中的重复项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Dynamics 365 CRM - 从SSRS报告中删除外部联接重复项