如何通过具有distinct子句的子查询中的列进行排序?

时间:2015-07-21 19:49:43

标签: 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 BY t2.ID
                FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') as talentName

在这种特殊情况下,我需要添加一个distinct子句(如图所示)。但是,当我这样做时,我收到以下错误:

    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语句中,因为它将作为结果集的一部分返回。我无法删除order by子句,因为逗号分隔列表的顺序必须与另一个列表匹配我生成ID。

我如何确保这个以逗号分隔的列表既清晰又顺序正确?

结束目标

为了帮助澄清我想要完成的任务,此查询将拉出t1.name和t1.ID的逗号分隔列表。我目前在两个单独的STUFF语句中执行此操作,但如果有替代方法,我将对此开放。这个查询将返回几千行,所以我试图找到一个基于集合的解决方案,以避免每次加载我们的网页时运行数千个临时查询。

1 个答案:

答案 0 :(得分:3)

您可以使用带GROUP BY的派生表,如下所示。 t1.ID包含在组中,假设它是table1的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