如何在具有不同子句的子查询中按列排序?
How do I order by a column in a subquery with a distinct clause?
我有一个非常大的查询,我需要在其中包含一个逗号分隔的列表。我正在使用这样的子查询来完成此操作:
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 语句中,因为它会被 returned 作为结果集的一部分。我无法删除 order by 子句,因为逗号分隔列表的顺序必须与我生成的 ID 的另一个列表相匹配。
我如何确保这个逗号分隔的列表既不同又顺序正确?
最终目标
为了帮助阐明我要完成的任务,此查询将提取 t1.name 和 t1.ID 的逗号分隔列表。我目前在两个单独的 STUFF 语句中执行此操作,但如果有替代方法,我会接受它。这个查询将 return 几千行,所以我试图找到一个基于集合的解决方案来避免每次我们的网页加载时成千上万的临时查询 运行。
您可以使用派生的 table 和 GROUP BY
,如下所示。 t1.ID
被包含在 group by 假设它是 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
我有一个非常大的查询,我需要在其中包含一个逗号分隔的列表。我正在使用这样的子查询来完成此操作:
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 语句中,因为它会被 returned 作为结果集的一部分。我无法删除 order by 子句,因为逗号分隔列表的顺序必须与我生成的 ID 的另一个列表相匹配。
我如何确保这个逗号分隔的列表既不同又顺序正确?
最终目标
为了帮助阐明我要完成的任务,此查询将提取 t1.name 和 t1.ID 的逗号分隔列表。我目前在两个单独的 STUFF 语句中执行此操作,但如果有替代方法,我会接受它。这个查询将 return 几千行,所以我试图找到一个基于集合的解决方案来避免每次我们的网页加载时成千上万的临时查询 运行。
您可以使用派生的 table 和 GROUP BY
,如下所示。 t1.ID
被包含在 group by 假设它是 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