выберите столбец типа 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