Sql 如何在具有distinct子句的子查询中按列排序?

Sql 如何在具有distinct子句的子查询中按列排序?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个非常大的查询,需要在其中包含一个逗号分隔的列表。我通过如下子查询来实现这一点: STUFF(( SELECT distinct ',' + t1.Name FROM t2 inner join t1 ON t1.ID = t2.ID WHERE t2.otherField = 12345 ORDER

我有一个非常大的查询,需要在其中包含一个逗号分隔的列表。我通过如下子查询来实现这一点:

        STUFF(( SELECT  distinct ',' + t1.Name
                FROM    t2
                        inner join t1   ON t1.ID        = t2.ID
                WHERE   t2.otherField = 12345
                ORDER BY t2.ID
                FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') as talentName
在这种特殊情况下,我需要添加一个独特的子句(如图所示)。但是,当我这样做时,会出现以下错误:

    Msg 145, Level 15, State 1, Line 2
    ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
我理解为什么会发生这种错误,但我不知道该怎么办。t2.ID不能包含在select语句中,因为它将作为resultset的一部分返回。我无法删除order by子句,因为逗号分隔的列表的顺序必须与我正在生成的ID的另一个列表相匹配

如何确保这个逗号分隔的列表是不同的,并且顺序正确

最终目标


为了帮助澄清我试图完成的任务,此查询将提取t1.name和t1.ID的逗号分隔列表。我目前在两个单独的STUFF语句中进行此操作,但如果有其他方法,我会接受它。此查询将返回数千行,因此我试图找到一种基于集合的解决方案,以避免每次加载网页时运行数千个临时查询。

您可以使用带有
分组依据的派生表,如下所示
t1.ID
包含在组中,假设它是表1的PK,因此这将正确区分同名的不同个体

 SELECT STUFF(
    ( 

  SELECT ',' + t1Name
FROM   (SELECT t1.Name    AS t1Name,
               min(t2.ID) AS t2ID
        FROM   t2
               INNER JOIN t1
                 ON t1.ID = t2.ID
        WHERE  t2.otherField = 12345
        GROUP  BY t1.ID,
                  t1.Name) x
ORDER  BY t2ID
FOR XML PATH('') 

, TYPE).value('.','VARCHAR(max)')               
                , 1, 1, '') as talentName

您可以使用带有
分组依据的派生表,如下所示
t1.ID
包含在组中,假设它是表1的PK,因此这将正确区分同名的不同个体

 SELECT STUFF(
    ( 

  SELECT ',' + t1Name
FROM   (SELECT t1.Name    AS t1Name,
               min(t2.ID) AS t2ID
        FROM   t2
               INNER JOIN t1
                 ON t1.ID = t2.ID
        WHERE  t2.otherField = 12345
        GROUP  BY t1.ID,
                  t1.Name) x
ORDER  BY t2ID
FOR XML PATH('') 

, TYPE).value('.','VARCHAR(max)')               
                , 1, 1, '') as talentName

您可以使用带有
分组依据的派生表,如下所示
t1.ID
包含在组中,假设它是表1的PK,因此这将正确区分同名的不同个体

 SELECT STUFF(
    ( 

  SELECT ',' + t1Name
FROM   (SELECT t1.Name    AS t1Name,
               min(t2.ID) AS t2ID
        FROM   t2
               INNER JOIN t1
                 ON t1.ID = t2.ID
        WHERE  t2.otherField = 12345
        GROUP  BY t1.ID,
                  t1.Name) x
ORDER  BY t2ID
FOR XML PATH('') 

, TYPE).value('.','VARCHAR(max)')               
                , 1, 1, '') as talentName

您可以使用带有
分组依据的派生表,如下所示
t1.ID
包含在组中,假设它是表1的PK,因此这将正确区分同名的不同个体

 SELECT STUFF(
    ( 

  SELECT ',' + t1Name
FROM   (SELECT t1.Name    AS t1Name,
               min(t2.ID) AS t2ID
        FROM   t2
               INNER JOIN t1
                 ON t1.ID = t2.ID
        WHERE  t2.otherField = 12345
        GROUP  BY t1.ID,
                  t1.Name) x
ORDER  BY t2ID
FOR XML PATH('') 

, TYPE).value('.','VARCHAR(max)')               
                , 1, 1, '') as talentName


因此,目前看来无法保证特定t1.name只能存在一个t2.id。这是怎么强制的吗?如果没有,应该使用哪个id进行订购?@MartinSmith道歉;这是在数据库中强制执行的。t1和t2之间在ID上有1:1的关系。我编辑了这个问题以更正列名中的不匹配。名称在t1中是唯一的吗?@MartinSmith没有强制t1.name是唯一的,但实际上它们通常是唯一的。我不希望依赖于t1.name总是唯一的假设。如果名称不是唯一的,那么它们将如何与您在其他地方的ID匹配,以相同的顺序?因此,目前似乎无法保证特定t1.name只能存在一个t2.ID。这是怎么强制的吗?如果没有,应该使用哪个id进行订购?@MartinSmith道歉;这是在数据库中强制执行的。t1和t2之间在ID上有1:1的关系。我编辑了这个问题以更正列名中的不匹配。名称在t1中是唯一的吗?@MartinSmith没有强制t1.name是唯一的,但实际上它们通常是唯一的。我不希望依赖于t1.name总是唯一的假设。如果名称不是唯一的,那么它们将如何与您在其他地方的ID匹配,以相同的顺序?因此,目前似乎无法保证特定t1.name只能存在一个t2.ID。这是怎么强制的吗?如果没有,应该使用哪个id进行订购?@MartinSmith道歉;这是在数据库中强制执行的。t1和t2之间在ID上有1:1的关系。我编辑了这个问题以更正列名中的不匹配。名称在t1中是唯一的吗?@MartinSmith没有强制t1.name是唯一的,但实际上它们通常是唯一的。我不希望依赖于t1.name总是唯一的假设。如果名称不是唯一的,那么它们将如何与您在其他地方的ID匹配,以相同的顺序?因此,目前似乎无法保证特定t1.name只能存在一个t2.ID。这是怎么强制的吗?如果没有,应该使用哪个id进行订购?@MartinSmith道歉;这是在数据库中强制执行的。t1和t2之间在ID上有1:1的关系。我编辑了这个问题以更正列名中的不匹配。名称在t1中是唯一的吗?@MartinSmith没有强制t1.name是唯一的,但实际上它们通常是唯一的。我不希望依赖于t1.name总是唯一的假设。如果名称不是唯一的,那么它们将如何与您在其他地方的ID匹配,以相同的顺序?这是一个优雅的解决方案,效果非常好;谢谢这是一个优雅的解决方案,效果非常好;谢谢这是一个优雅的解决方案,效果非常好;谢谢这是一个优雅的解决方案,效果非常好;谢谢