Question

Je suis en train de joindre deux tables SQL, parent (que j'ai le contrôle complet de conception plus) et de l'enfant (que je ne peux pas changer). J'ai changé la table parent afin qu'il ait une colonne varchar, contenant une liste CSV des ids des enregistrements enfants. Je voudrais maintenant faire une sélection de retourner une ligne par parent, et certains compteurs re. les enfants (à savoir. Combien d'enfants ont un « statut » de vrai).

Je l'avais d'abord pensé que je pouvais convertir la liste CSV dans une chaîne de Xml, jeté à une colonne de type Xml, et se joindre à la table des enfants en utilisant les Xml « nœuds » - mais je ne peux pas sembler obtenir la syntaxe droit.

Quelqu'un peut-il suggérer comment cela pourrait se faire?

Merci, Ross

(voici ce que j'ai jouer avec)

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)
Était-ce utile?

La solution

Avec un peu plus et tripoter recherche sur Google, j'ai maintenant ceci:

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

raisonnable?

Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top