我正在尝试为我正在编写的存储过程找到使用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
答案 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.RelatedData
或LEFT JOIN ... IS NULL
。
答案 2 :(得分:0)
如果两者之间没有确切的关系,我想不出任何其他方式可以执行此操作。