Pregunta

Estoy tratando de unir dos tablas SQL, los padres (que no tengo control completo sobre el diseño) e hijo (que no se puede cambiar). He cambiado la tabla primaria de modo que tenga una columna varchar, que contiene una lista CSV de los identificadores de los registros secundarios. Ahora me gustaría hacer una línea de selección de regresar por los padres, y algunos contadores de volver. los niños (es decir. cuántos niños tienen un "status" de verdad).

Yo había pensado en un principio que podría convertir a la lista CSV en una cadena XML, echarlo a una columna de tipo XML, y unirse a la tabla secundaria usando el XML "nodos" - pero me parece que no puede obtener la sintaxis derecho.

Puede alguien sugerir cómo esto se podría hacer?

Gracias, Ross

(esto es lo que he estado jugando con)

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)
¿Fue útil?

Solución

Con un poco más tocar el violín y buscar en Google, ahora tengo esto:

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

Razonable?

Gracias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top