Pergunta

Estou tentando ingressar em duas tabelas SQL, pai (sobre o qual tenho controle completo de design) e filho (que não posso mudar). Eu mudei a tabela pai para que ela tenha uma coluna VARCHAR, contendo uma lista de CSV dos IDs dos registros da criança. Agora gostaria de fazer uma seleção devolvendo uma linha por pai e alguns contadores. As crianças (ou seja, quantas crianças têm um "status" de verdadeiro).

Originalmente, pensei que poderia converter a lista de CSV em uma string xml, lançá -la em uma coluna do tipo XML e entrar na tabela infantil usando o XML "nós" - mas não consigo acertar a sintaxe.

Alguém pode sugerir como isso pode ser feito?

Obrigado, Ross

(Aqui está o que eu tenho brincado)

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

Solução

Com um pouco mais de brincadeira e pesquisando no Google, agora tenho isso:

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

Razoável ?

Obrigado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top