выберите столбец типа xml в запросе select with group by SQL Server 2008

Я пишу запрос 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. Когда я добавляю столбец в список выбора, я получаю эту ошибку -

столбец таблицы.myXML " недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в группе BY пункт.

и когда я добавляю столбец в предложение group by, я получаю эту ошибку -

тип данных XML нельзя сравнить или отсортировать, за исключением случаев использования оператора IS NULL.

Я совершенно смущен тем, как выйти из этого. Я хочу получить XML-данные из столбца.

спасибо

3 ответов


вы не можете группировать по XML или текстовым столбцам, вам сначала нужно будет преобразовать в 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.


Я не уверен, почему вы используете 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

Если у вас есть какие-либо столбцы с уникальными данными в вашей таблице, вы можете использовать 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