SQL присоединиться, используя значения CSV?Может быть, используя Xml? - PullRequest
0 голосов
/ 01 марта 2010

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

Первоначально я думал, что смогу преобразовать список 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)

1 Ответ

0 голосов
/ 01 марта 2010

С немного большим трепетом и поиском, теперь у меня есть это:

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

Разумно?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...