Sql server 如何在SQLServer2008中选择distinct,但只针对多个字段中的一个字段?
我有一个问题:Sql server 如何在SQLServer2008中选择distinct,但只针对多个字段中的一个字段?,sql-server,Sql Server,我有一个问题: SELECT Content.content_name, Language2.Name, Language2.language_id, Content.id, Content.content_description, FROM Language AS Language2 LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id) 如何仅选择不同的内容名称?您的意思是如下所示
SELECT Content.content_name, Language2.Name, Language2.language_id,
Content.id, Content.content_description,
FROM Language AS Language2
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id)
如何仅选择不同的内容名称?您的意思是如下所示
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
您可以这样做:
SELECT DISTINCT Content.content_name
FROM Language AS Language2
LEFT JOIN contents AS Content ON (Language2.language_id = Content.language_id)
那么为什么这不能回答你的问题呢
让我们考虑下面的数据(仅前两列):
选择DISTINCT
意味着您只需要一行,但名称需要什么
您需要做的是重写代码以使用groupby
,并为其他列选择适当的聚合函数:
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
现在,很可能这也不会产生您想要的结果,但有一点是肯定的,您不能欺骗数据库引擎只是“选择要返回的行中的一行,我不管是哪一行。”+1回答得好。你是不是因为内容名称而离开了这个小组?我也使用这种方法,但我总是觉得这样做很肮脏。MIN和MAX真的在这里做对了吗?其他数据库使用什么,比如mySQL和Oracle,让您为DISTINCT关键字选择一列?他们是在幕后做最小/最大值吗?我想Oracle不允许你这么做,但我想知道mySQL是如何以这种特定的方式工作的……我不知道,但坦率地说这是一个问题,所以如果你真的想知道的话,你应该发布它。它所涉及的空间比评论中可用的空间要大。这种方法比在其他答案中使用分钟要好得多,因为每一列的分钟数都是独立计算的,所以最终会得到实际上在db中不存在的行
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
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