2011-08-22 181 views
0

這是我的查詢。我需要爲每個線程只選擇一條不同的記錄,但因爲我正在返回,所以它不能是唯一的,並且返回兩條記錄。需要SQL查詢幫助嗎?

請幫我修改我的查詢,使其工作。謝謝

SELECT DISTINCT T2.Name, T0.ThreadID, (CASE WHEN T0.Status = 0 THEN 1 ELSE 0 END) AS Highlight 
FROM Messaging T0 
INNER JOIN Table1 T1 ON T0.ThreadID = T1.ThreadID 
INNER JOIN Table2 T2 ON T0.UserID = T2.UserID 
INNER JOIN Table3 T3 ON T3.ID = T0.ID 
WHERE T0.UserID != 9149 
GROUP BY U.Name, M.ThreadID 
ORDER BY Highlight DESC 

該查詢返回結果就像你可以看到下面

Name ThreadID        Highlight 
Alex 048C8E05-422C-491A-880C-AE370194AE8C  1 
Andrew 048C8E05-422C-491A-880C-AE370194AE8B  0 
Alex 048C8E05-422C-491A-880C-AE370194AE8C  0 



Table T0 

RecordID UserID    ThreadID         Status 
1   9090     048C8E05-422C-491A-880C-AE370194AE8C  0 
2   9149     048C8E05-422C-491A-880C-AE370194AE8C  1 
3   9090     048C8E05-422C-491A-880C-AE370194AE8C  1 
4   5454     048C8E05-422C-491A-880C-AE370194AE8B  0 
5   9149     048C8E05-422C-491A-880C-AE370194AE8B  0 
+0

創業所以,如果你只想要一個行亞歷克斯,高亮值你想'選擇哪個'? 0,1?最老的?最新的? – Matthew

+0

是隻有一行,如果至少有一個0突出顯示爲真,如果不突出顯示false –

+0

我爭辯說,這個問題已經回答了標準SQL。你在哪些數據庫中使用發佈的答案不起作用?請將您的結果發佈在Abe Miessler的答案 – Matthew

回答

2

我看到這個問題,所有的時間。你將不得不決定你想要哪些值。正如@詹姆斯希爾指出,你已經要求所有不同的列集,這正是你得到的。

如果您不是真的想要這些值的不同組合,您將需要指定要刪除哪一個。通常人們會採取MAX或MIN值。通常,它看起來是這樣的:

SELECT DISTINCT T2.Name, T0.ThreadID, MAX((CASE WHEN T0.Status = 0 THEN 1 ELSE 0 END)) AS Highlight 
FROM Messaging T0 
INNER JOIN Table1 T1 ON T0.ThreadID = T1.ThreadID 
INNER JOIN Table2 T2 ON T0.UserID = T2.UserID 
INNER JOIN Table3 T3 ON T3.ID = T0.ID 
WHERE T0.UserID != 9149 
GROUP BY U.Name, M.ThreadID 
ORDER BY Highlight DESC 

你必須測試如何與在那裏的情況下語句的工作,但這是一般的想法。

+0

它返回三條記錄,它不適用於我 –

+0

它返回三條記錄? –

+0

@Abe Miessler +1這是基於OP問題的正確答案。我會通過別名來描述真實列的名稱。 – Matthew

0

你必須選擇哪些值用於狀態/高亮如果有多個。這裏有一個選擇 - 使用MAX():

SELECT DISTINCT T2.Name, T0.ThreadID, max(CASE WHEN T0.Status = 0 THEN 1 ELSE 0 END) AS Highlight 
FROM Messaging T0 
INNER JOIN Table1 T1 ON T0.ThreadID = T1.ThreadID 
INNER JOIN Table2 T2 ON T0.UserID = T2.UserID 
INNER JOIN Table3 T3 ON T3.ID = T0.ID 
WHERE T0.UserID != 9149 
GROUP BY U.Name, M.ThreadID 
ORDER BY 3 DESC 

你可以使用MIN()或任何其他聚合函數

+0

它返回相同的3條記錄 –

+1

什麼確切;你是什麼意思? - 每個名稱/線程組合只能有一條記錄 – Bohemian