2015-07-21 54 views
0

我有一个非常大的查询,我需要在一个逗号分隔的列表我与子查询实现这个像这样:如何在子查询中使用不同子句的列进行排序?

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

我该如何确保这个逗号分隔的列表既是独特的,又是正确的顺序?

最终目标

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

+0

所以目前看来没有任何保证只有一个t2.id可以存在于特定的t1.name中。这是否强制执行?如果没有哪个id应该用于排序? –

+0

@MartinSmith道歉;这是在数据库中强制执行的。在ID上加入t1和t2之间有1:1的关系。我编辑了这个问题以纠正列名中的不匹配。 – Nicholas

+0

在t1中是否是唯一的名称? –

回答

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 
+0

这是一个很好的解决方案,谢谢! – Nicholas

相关问题