【问题标题】:Is a FULL OUTER JOIN neccessary for this situation?这种情况是否需要 FULL OUTER JOIN?
【发布时间】:2011-07-06 12:52:03
【问题描述】:

我正在尝试为我正在编写的存储过程寻找一种替代方法来使用 FULL OUTER JOIN。这是场景。

代表需要发生的事件的两个大部分不相关的数据表。事件需要按时间顺序处理,并且两个表都有一个日期时间列。所以我需要一个表来作为所有这些按日期时间排序的事件的列表(这两个日期时间列需要混合在一起)。

一个小问题:有时两个表中的事件是相关的,在这种情况下,无论日期时间如何,表 A 中的事件都需要先发生。因此,如果 A 有 3 个事件,B 有 3 个事件,但 A 和 B 之间只有一个相关对,我想返回 5 行。如果有不相关的数据,就会有 NULL 数据(没关系,我使用 NULL 数据检查来确定下一步要做什么,即处理事件 A 或 B 等)

目前我所拥有的看起来像这样:

    SELECT
    CASE
        WHEN A.EventDateTime IS NULL THEN B.EventDateTime
        ELSE A.EventDateTime 
    END AS SortDateTime,
    A.EventId,
    B.EventId,
    FROM A FULL OUTER JOIN B
    ON A.RelatedData=B.RelatedData
    ORDER BY SortDateTime

【问题讨论】:

  • event from Table A needs to go first regardless of the datetime 是指在 A 事件之后插入 B 事件,还是根本不插入?您能否给我们一些测试数据,比如 A 中的 3 个事件,B 中的 3 个事件,以及您需要的结果?

标签: sql-server outer-join


【解决方案1】:

应该没问题

也代替使用 CASE

 CASE
        WHEN A.EventDateTime IS NULL THEN B.EventDateTime
        ELSE A.EventDateTime 
    END AS SortDateTime,

你可以这样做

COALESCE(A.EventDateTime,B.EventDateTime) AS SortDateTime,

有点短

【讨论】:

    【解决方案2】:

    如果你真的想避免 OUTER JOIN 你可以试试

    SELECT A.EventDateTime, A.EventID
    FROM A
    UNION ALL
    SELECT B.EventDateTime, B.EventID
    FROM B WHERE B.RelatedData NOT IN (SELECT RelatedData FROM A)
    

    上面的NOT IN 可以写成NOT EXISTS SELECT 1 FROM A WHERE A.RelatedData = B.RelatedDataLEFT JOIN ... IS NULL 如果您的RDBMS 有偏好(或者如果相关子查询更适合您的数据集)。

    【讨论】:

      【解决方案3】:

      如果两者之间没有确切的关系,我想不出任何其他方式可以执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        相关资源
        最近更新 更多