выберите столбец типа XML в запросе выбора с группой SQL Server 2008 - PullRequest
7 голосов
/ 07 марта 2011

Я пишу запрос на выборку, в котором я выбираю несколько столбцов (путем объединения 3-4 таблиц). Я использую группу по выражению, чтобы сгруппировать свои результаты.

Запрос -

    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, я получаю эту ошибку -

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

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

Спасибо

Ответы [ 3 ]

17 голосов
/ 07 марта 2011

Вы не можете группировать по столбцам 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 голос
/ 07 марта 2011

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

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