Oracle 完全联接中的重复项 [重复]

Posted

技术标签:

【中文标题】Oracle 完全联接中的重复项 [重复]【英文标题】:Duplicates in Oracle Full Join [duplicate] 【发布时间】:2021-01-16 18:32:45 【问题描述】:

我阅读了this 关于完全连接工作的文章。

文章说Full Join 结合了Left JoinRight 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);

对于USINGCUSTOMERID 在结果集中只出现一次。

【讨论】:

以上是关于Oracle 完全联接中的重复项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Dynamics 365 CRM - 从SSRS报告中删除外部联接重复项

在SQL左联接中删除重复项

Oracle中如何删除重复数据

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

Oracle SQL:如何删除 listagg 中的重复项

如何使用消除重复的联接从另一个表中插入一个表[重复]