У меня есть TableC и TableA. Мне нужны все записи из таблицы C, тогда как только соответствующие записи из таблицы A, поэтому я использую «левое соединение». Проблема в том, что TableA имеет столбец XML. XML в этом столбце имеет следующую структуру
<x:main xmlns:x="x-elements">
<x:rules>
<x:obj>
<ruleName>name1</ruleName>
<createdBy>userA</createdBy>
<type>bbb</type>
</x:obj>
<x:obj>
<ruleName>name2</ruleName>
<createdBy>userA</createdBy>
<type>ccc</type>
</x:obj>
</x:rules>
<x:info>
<x:obj>
<target>ftp:1</target>
<user>userB</user>
</x:obj>
<x:obj>
<target>ftp:3</target>
<user>userA</user>
</x:obj>
</x:info>
</x:main>
Я хочу получить createdBy
из столбца XML для каждой строки, где эквивалент type
равен «ccc».
Ниже мои усилия
with xmlnamespaces ('x-elements' as x),
res1 as (select x.xmlCol.value('(createdBy)[1]', 'varchar(500)') prop1
from TableC c
left join TableA a
cross apply a.xCol.nodes('x:main/x:rules/x:obj') x(xmlCol)
on c.Id = a.Id
where x.xmlCol.value('(type)[1]', 'varchar(500)') = 'ccc')
select
c.Name,
(select prop1 from res1) prop1
from TableC c
left join TableA a
on c.Id = a.Id
Однако я получаю сообщение об ошибке
Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=, ‹, ‹= , >, >= или когда подзапрос используется как выражение.
Может ли кто-нибудь указать, как добиться того, что я пытаюсь сделать здесь?
PS Позже я также хотел бы получить «цель» из столбца XML для каждой строки, где эквивалент user
- это «userA».