我正在编写一个select查询,其中我将获取多个列(通过连接3-4个表)。 我使用group by子句对结果进行分组。
查询 -
select ci.Candidate_Id, ci.FirstName, ci.DetailXML
from Candidate_Instance ci
where ci.Candidate_Instance_Id=2
group by
ci.Candidate_Id, ci.FirstName, ci.DetailXML
其中一个表有一个XML数据类型的列。当我在选择列表中添加列时,我收到此错误 -
列'table.myXML'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
当我在group by子句中添加列时,我收到此错误 -
除非使用IS NULL运算符,否则无法比较或排序XML数据类型。
我对如何解决这个问题感到很困惑。 我想从列中获取XML数据。
由于
答案 0 :(得分:17)
您不能按XML或TEXT列进行分组,首先需要转换为varchar(max)
select ci.Candidate_Id, ci.FirstName, convert(xml,convert(varchar(max),ci.DetailXML)) DetailXML
from Candidate_Instance ci
where ci.Candidate_Instance_Id=2
group by
ci.Candidate_Id, ci.FirstName, convert(varchar(max),ci.DetailXML)
在第一行,它被转换为varchar(max)以匹配GROUP BY子句,稍后它将重新转换回XML。
答案 1 :(得分:1)
我不确定你为什么在这里根据你问题中的信息使用group by
但是无论如何这都可行,因为看起来你只是将它包含在group by
中才能成为能够select
它。
;with cte as
(
select ci.Candidate_Id,
ci.FirstName,
ci.DetailXML,
ROW_NUMBER() OVER (PARTITION by ci.Candidate_Id, ci.FirstName ORDER BY (SELECT 0)) AS RN
from Candidate_Instance ci
where ci.Candidate_Instance_Id=2
)
SELECT Candidate_Id, FirstName, DetailXML
FROM cte
WHERE RN=1
答案 2 :(得分:0)
如果您的表中有任何具有唯一数据的列,您可以使用CTE,如果该列上有索引,那么这将是一个快速解决方案:
with cte as
(
select
ci.Candidate_Id,
ci.FirstName
from Candidate_Instance ci
where ci.Candidate_Instance_Id=2
group by
ci.Candidate_Id,
ci.FirstName
)
select
a.*,
b.DetailXML
from cte a
inner join Candidate_Instance b
on a.Candidate_Id = b.Candidate_Id -- <--this must be unique within Candidate_Instance