何时使用完全外连接是一个好的情况?

时间:2010-01-19 15:53:36

标签: sql sql-server

我总是不鼓励使用它,但有什么情况是最好的方法吗?

7 个答案:

答案 0 :(得分:36)

这种情况很少见,但我有一些使用它的情况。通常在例外报告或ETL或其他非常特殊的情况下,双方都有您想要合并的数据 另一种方法是使用INNER JOINLEFT JOIN(右侧IS NULL)和RIGHT JOIN(左侧IS NULL)并执行{{{ 1}} - 有时这种方法更好,因为你可以更明显地自定义每个单独的连接(并添加一个派生列来指示找到哪一方或者是否在两者中找到它以及哪一方将获胜)。

答案 1 :(得分:20)

我注意到维基百科页面provides an example

  

例如,这可以让我们看到   每个在部门的员工   并且每个部门都有   员工,也看到每个员工   谁不属于部门和   每个没有的部门   雇员。

请注意,我在实践中从未遇到过需要完全外连接的问题......

答案 2 :(得分:14)

在尝试从我的两个表中查找不匹配的孤立数据时,我使用了完全外连接,并且想要我的所有结果集,而不仅仅是匹配。

答案 3 :(得分:3)

我使用它的罕见时间一直在测试连接两边的NULL,以防我认为SQL i测试中使用的初始INNER JOIN中缺少数据。

答案 4 :(得分:3)

就在今天,我不得不使用Full Outer Join。在比较两个表的情况下,它很方便。例如,我比较的两个表来自不同的系统,所以我想得到以下信息:

  1. 表A包含表B中没有的任何行
  2. 表B包含表A中没有的任何行
  3. 表A或表B中的重复
  4. 对于匹配行,值是否不同(例如:表A和表B都有Acct#12345,LoanID abc123,但利率或贷款金额不同
  5. 此外,我在SELECT语句中创建了一个附加字段,该字段使用CASE语句来“评论”我为什么要标记此行。示例:利率不匹配/系统A等中不存在该帐户

    然后将其保存为视图。现在,我可以使用此视图创建报告并将其发送给用户进行数据更正/输入,或者使用它来通过我使用CASE语句创建的“评论”字段来提取特定人口(例如:所有不匹配的记录我的存储过程和自动更正等等。

    如果你想看一个例子,请告诉我。

答案 5 :(得分:1)

它们很容易找到孤立的数据,但我很少在生产代码中使用它们。我不会“总是不鼓励使用”,但我认为在现实世界中,与内部和左/右outers相比,它们不太经常是最佳解决方案。

答案 6 :(得分:1)

在我使用Full Outer Join的极少数情况下,它用于数据分析,例如比较来自不同数据库的两个客户表以查找每个表中的重复项或比较两个表结构,或查找一个表中的空值与另一个表相比,或者在一个表中找到与另一个表相比的缺失信息。