【问题标题】:When is a good situation to use a full outer join?什么时候使用完全外连接比较合适?
【发布时间】:2011-01-06 21:04:12
【问题描述】:

我总是不鼓励使用一种方法,但有没有一种情况是最好的方法?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      例如,这可以让我们看到 一个部门的每个员工 每个部门都有一个 员工,还能看到每个员工 谁不是部门的一部分,并且 每个没有一个部门 员工。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我很少使用它来测试连接两侧的 NULL,以防我认为我正在测试的 SQL 中使用的初始 INNER JOIN 中缺少数据。

          【讨论】:

            【解决方案5】:

            它们对于查找孤立数据很方便,但我很少在生产代码中使用它们。我不会“总是不鼓励使用”,但我认为在现实世界中,与内部和左/右外部相比,它们通常不是最佳解决方案。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

                就在今天,我不得不使用完全外连接。在比较两个表的情况下很方便。例如,我比较的两个表来自不同的系统,所以我想获得以下信息:

                1. 表 A 有任何不在表 B 中的行
                2. 表 B 有任何不在表 A 中的行
                3. 表 A 或表 B 中的重复项
                4. 对于值是否不同的匹配行(例如:表 A 和表 B 都有 Acct# 12345,LoanID abc123,但利率或贷款金额不同

                此外,我在 SELECT 语句中创建了一个附加字段,该字段使用 CASE 语句来“注释”我标记这一行的原因。示例:利率不匹配/系统 A 中不存在该帐户等。

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

                如果您想查看示例,请告诉我。

                【讨论】:

                • 这就是为什么可重用视图(与只有一个明确的用户和目的的视图相反)通常不受欢迎的原因!人们将这样的东西放在视图中,然后有人出现并使用各种过滤器多次使用它。接下来你知道系统是固定的,人们想知道为什么。任何过滤几乎不可避免地会丢弃这样一个结果集(内部、左侧或右侧)的三个部分中的一个或多个。使用 Full 时,查询优化器无法丢弃不相关的连接,因此会做很多额外的工作,只是在过滤步骤中将其丢弃。
                • 我认为你看错了。我别无选择,只能创建一个完全连接,因为我正在比较两个不同的系统。这种观点是一种完整性。如果您有适当的流程(代码测试/批准等),它将防止“有人出现”并多次使用此视图。
                猜你喜欢
                • 2015-02-11
                • 1970-01-01
                • 2010-10-22
                • 1970-01-01
                • 2011-09-13
                • 2011-02-21
                • 2010-10-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多