2011-03-01 56 views
1

我正试图找到一种替代方法来使用我写的存储过程的全外联接。这是场景。这是一个完整的外部连接需要吗?

两张大多数无关的数据表,表示需要发生的事件。这些事件需要按时间顺序进行处理,并且这两个表都有一个日期时间列。所以我需要得到一个单独的表,充当按照datetime排序的所有这些事件的列表(这两个日期时间列需要混合在一起)。

一个小问题:有时两个表中的事件会有关系,在这种情况下,无论日期时间如何,来自表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

您的意思是来自表A的事件需要先行,而不管日期时间,您在A事件之后插入B事件,还是根本不?你能否给我们一些测试数据,例如A中的3个事件,B中的3个事件,以及你需要的结果? – 2011-03-01 13:59:23

回答

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, 

这是一个小短

+0

啊,谢谢你的COALESCE位,很整洁! – Rich 2011-03-01 14:12:00

1

如果你真的想避免您可能会尝试的外部连接

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有偏好(或者,如果相关子查询是更好地为您的数据集)。

相关问题