Frage

Ich versuche, zwei SQL-Tabellen zu verknüpfen, Eltern (die ich komplette Design Kontrolle über) und Kind (die ich nicht ändern kann). Ich habe die übergeordnete Tabelle geändert, so dass es eine Varchar-Spalte hat, eine CSV-Liste des IDs des untergeordneten Datensätze enthält. Ich möchte nun eine ausgewählte Rückkehr eine Zeile pro Elternteil zu tun, und einige Zähler wieder. die Kinder (dh., wie viele Kinder eine „Status“ wahr haben).

hatte ich ursprünglich dachte, dass ich die CSV-Liste in eine XML-Zeichenfolge umwandeln konnte, warf es zu einer Spalte vom Typ XML, und sich der Kind-Tabelle unter Verwendung der XML „Knoten“ - aber ich kann scheinen nicht die Syntax zu erhalten rechts.

Kann jemand empfehlen, wie dies geschehen könnte?

Danke, Ross

(hier ist, was ich liebäugelt schon mit)

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)
War es hilfreich?

Lösung

Mit etwas mehr Hantieren und googeln, ich das jetzt haben:

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

Vernünftige?

Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top