Domanda

Sto cercando di unire due tabelle SQL, genitori (che hanno il controllo completo di progettazione oltre) e bambini (che non posso cambiare). Ho cambiato la tabella padre in modo che abbia una colonna varchar, contenente un elenco CSV degli ID dei record figlio. Vorrei ora fare un una riga di selezione ritorno al genitore, e alcuni contatori ri. i bambini (es. quanti bambini hanno uno "status" del vero).

Avevo inizialmente pensato che avrei potuto convertire l'elenco CSV in una stringa XML, il cast a una colonna di tipo XML, e partecipare alla tabella figlio utilizzando i "nodi" XML - ma io non riesco a ottenere la sintassi a destra.

Qualcuno può suggerire come questo potrebbe essere fatto?

Grazie, Ross

(ecco quello che ho accarezzato)

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)
È stato utile?

Soluzione

Con un po 'più giocherellare e usare Google, ora ho questo:

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

ragionevole?

Grazie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top