2011-07-14 88 views
3

我想知道是否可以在SQL中執行類似下面的操作。SQL有條件地選擇一行

假設你有三張表。 字段ID爲通過所有數據庫

Table1 - PK Id, .... 
Table2 - PK Id, T3FK, TimeStamp,.... 
Table3 - PK Id, identity, Status, .... 

Table1.id (1 to *) Table 2.id 
Table1.id (1 to *) Table 3.id 
Table2.id+Table2.T3FK (1 to *) Table3.Id+Table3.identity 

我想下面的選擇語句組合關係鍵:

SELECT T1.*, T2.* 
    FROM Table1 T1 
    JOIN Table2 T2 ON T1.Id = T2.Id 
    JOIN Table3 T3 on T1.Id = T3.Id 
WHERE T3.Status = 'A' 
    AND T2.P3Fk = T3.identity 
    AND T1.id IN (SELECT Id 
        FROM ListOfIds) 

...和:

SELECT T1.*, T2.* 
    FROM Table1 T1 
    JOIN Table2 T2 ON T1.id = T2.id 
    JOIN (SELECT id, MAX(TimeStamp) as TimeStamp 
      FROM Table2 
     GROUP BY id) t2a ON t2.id = t2a.id 
         AND t2.TimeStamp = t2a.TimeStamp 
WHERE t1.Id IN (SELECT Id 
        FROM ListOfIds) 

所以基本上我我試圖做的是有一條select語句返回 T2 where T2.P3FK = T3.identity and T3.status = 'A'中的行,如果不存在,則 返回T2中具有最新時間戳的行。我需要做一個ID列表,而不只是一個ID。

+1

對於什麼數據庫? –

回答

2

也許最簡單的方法是將JOIN修改爲T2和T3,並將JOIN添加到t2a,然後使用任意一種情況或在T2中需要的所有字段上合併。

SELECT T1.*, 
    COALESCE(T2.id,t2a.id) id, 
    COALESCE(... 
    FROM Table1 T1 
    LEFT JOIN (Table2 T2 
    INNER JOIN Table3 T3 on T1.Id = T3.Id 
      and T3.status = 'A') 
    ON T1.Id = T2.Id 
    INNER JOIN (SELECT id, MAX(TimeStamp) as TimeStamp 
      FROM Table2 
     GROUP BY id) t2a ON t2.id = t2a.id 
         AND t2.TimeStamp = t2a.TimeStamp 
WHERE t1.Id IN (SELECT Id 
        FROM ListOfIds) 
+0

謝謝康拉德!我用你所說的話,它就像一個魅力。我感謝您的幫助。我需要15點的信譽來upvote,但我會,當我得到的。謝謝 – crsavage0630

+0

@ crsavage0630很高興能幫到你。既然你提到過它,你可能想看看Meta上的[接受答案如何工作?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work),而不是我遊說你接受我的答案;) –

0

我很努力的去理解這個問題,但是如果你需要返回不同的數據,你可以把CASE語句放入SQL中(取決於你的數據庫),根據條件返回不同的字段。

您可能需要根據您的數據庫查找確切的詳細信息。