SQL join с использованием значений CSV ?Может быть, используя Xml?

StackOverflow https://stackoverflow.com/questions/2355396

  •  23-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь объединить две таблицы SQL, родительскую (над которой у меня есть полный контроль над дизайном) и дочернюю (которую я не могу изменить).Я изменил родительскую таблицу так, чтобы в ней был столбец varchar, содержащий CSV-список идентификаторов дочерних записей.Теперь я хотел бы выполнить select, возвращающий по одной строке для каждого родителя, и некоторые счетчики повторяются.дети (т.е.сколько детей имеют "статус" true).

Первоначально я думал, что смогу преобразовать список CSV в строку Xml, преобразовать его в столбец типа Xml и присоединиться к дочерней таблице, используя Xml "узлы", но, похоже, я не могу правильно использовать синтаксис.

Кто - нибудь может подсказать , как это можно было бы сделать ?

Спасибо, Росс

(вот с чем я играл)

declare @true bit; set @true = ~0
declare @false bit; set @false = 0
declare @parent table (id int, children varchar(max))
declare @child table (id int, status bit)

insert into @parent values (1,'1,2,3')
insert into @child values (1,@true)
insert into @child values (2,@false)
insert into @child values (3,@false)

;with parent as
(
select id as 'parentId', cast('<children><child id="' + replace (children,',','"/><child id="') + '"/></children>' as xml) as 'children' from @parent
)
select parentId, t2.child.query('.')
from parent
--join @child as child on (child.id = ??)
cross apply children.nodes('/children/child') as t2(child)
Это было полезно?

Решение

Еще немного повозившись и погуглив, теперь у меня есть это:

declare @true bit; set @true = ~0
declare @false bit; set @false = 0
declare @parent table (id int, children varchar(max))
declare @child table (id int, status bit)

insert into @parent values (1,'1,2,3')
insert into @child values (1,@true)
insert into @child values (2,@false)
insert into @child values (3,@false)
insert into @parent values (2,'4,5,6')
insert into @child values (4,@true)
insert into @child values (5,@false)
insert into @child values (6,@false)

;with parent as
(
select id as 'id', cast('<children><child id="' + replace(children,',','"/><child id="') + '"/></children>' as xml) as 'children' from @parent
)
select   parent.id
    ,count(child.id) as 'children'
    ,sum(case when child.status = @true then 1 else 0 end) as 'success'
    ,sum(case when child.status = @false then 1 else 0 end) as 'failed'
from parent
cross apply children.nodes('/children/child') as t2(child)
join @child as child on (child.id = t2.child.value('@id', 'int'))
group by parent.id

Разумно ?

Спасибо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top