我有一个非常大的查询,我需要在其中包含逗号分隔列表。我用子查询完成此操作:
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语句中执行此操作,但如果有替代方法,我将对此开放。这个查询将返回几千行,所以我试图找到一个基于集合的解决方案,以避免每次加载我们的网页时运行数千个临时查询。
答案 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