在SQL Server 2008中使用group选择查询中的xml类型列

时间:2011-03-07 16:29:57

标签: sql-server xml group-by

我正在编写一个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数据。

由于

3 个答案:

答案 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