这种情况需要一个完整的外部联接吗?

时间:2011-03-01 13:47:44

标签: sql-server outer-join

我正在尝试为我正在编写的存储过程找到使用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

3 个答案:

答案 0 :(得分:5)

那应该没问题

也代替使用CASE

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

你可以这样做

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

哪个更短

答案 1 :(得分:1)

如果你真的想避开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)

如果您的RDBMS具有首选项(或者相关子查询对您的数据集更好),则上述NOT IN in可以写为NOT EXISTS SELECT 1 FROM A WHERE A.RelatedData = B.RelatedDataLEFT JOIN ... IS NULL

答案 2 :(得分:0)

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