2011-03-01 79 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有偏好(或者,如果相關子查詢是更好地爲您的數據集)。

相關問題