这是我的查询。我需要为每个线程只选择一个不同的记录但是因为我正在返回突出显示它不能是唯一的并且返回两个记录用于相同的步骤。
请帮我修改我的查询以使其正常工作。谢谢
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 :(得分:2)
我一直看到这个问题。您将不得不决定您想要哪些值。正如@James Hill所指出的那样,你已经要求所有不同的列集,这正是你得到的。
如果您真的不想要这些值的不同组合,则需要指定要丢弃的值。通常人们会采用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
你必须测试其中的case语句是如何工作的,但这是一般的想法。
答案 1 :(得分: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()或任何其他聚合函数