SQL انضم باستخدام قيم CSV؟ باستخدام XML ربما؟
سؤال
أحاول الانضمام إلى جدولين 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)
المحلول
مع المزيد من العبث والغوغل ، لدي الآن:
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
مسؤول ؟
شكرًا.
لا تنتمي إلى StackOverflow