Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer2008中选择distinct,但只针对多个字段中的一个字段?_Sql Server - Fatal编程技术网

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