2010-04-27 67 views

回答

18

你这样做:

SELECT DISTINCT Content.content_name 
FROM Language AS Language2 
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id) 

那么,为什么这不回答你的问题?

让我们看看下面的数据(只是前两列):

content_name  Name 
XXXXX   1234 
XXXXX   5678 

SELECT DISTINCT意味着你只需要一个行,但你要为名称什么?

你需要做的是重新编写代码来使用GROUP BY和挑选其他列相应的聚合函数:

SELECT 
    Content.content_name, 
    MIN(Language2.Name) AS Name, 
    MIN(Language2.language_id) AS language_id, 
    MIN(Content.id) AS id, 
    MIN(Content.content_description) AS content_description, 
FROM 
    Language AS Language2 
    LEFT JOIN contents AS Content 
     ON (Language2.language_id = Content.language_id) 
GROUP BY 
    Content.content_name 

现在,很有可能这不会产生你想要任何东西,但有一点是确实,你不能欺骗数据库引擎“只选择一行返回,我不关心哪一行”。

+0

+1好答案。您是否通过关闭content_name来关闭组? – 2010-04-27 11:53:45

+0

是的,现在添加它,并重新格式化SQL。 – 2010-04-27 11:56:54

+0

我也使用这种方法,但我总是觉得这样做很脏。 MIN和MAX真的是在这里做的正确的事情吗?其他数据库使用的其他数据库如mySQL和Oracle允许您为DISTINCT关键字选择单个列?他们在幕后做MIN/MAX吗? – emalamisura 2012-10-15 16:52:25

1

你的意思是像下面

SELECT Content.content_name, 
FROM Language AS Language2 
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id) 
Group by Content.content_name 
4
WITH q AS 
     (
     SELECT Content.content_name, Language2.Name, Language2.language_id, Content.id, Content.content_description, ROW_NUMBER() OVER (PARTITION BY content_name ORDER BY language_id) AS rn 
     FROM Language Language2 
     LEFT JOIN 
       Contents AS Content 
     ON  Language2.language_id = Content.language_id 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 
+0

这种方法比在其他答案中做MIN要好得多,因为MIN是针对每列独立计算的,因此最终会得到实际上不存在于db中的行 – sparrow 2017-04-11 09:00:50