2011-08-22 90 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