concatenação de tabelas
neste exemplo vamos consultar uma tabela NxN Produto e Fornecedor, vamos listar todos os produtos e para cada produto vamos listar os seus fornecedores cadastrados, mas somente em uma única linha por produto separados por vírgula
neste exemplo também usaremos alguns recursos interessantes como tabela virtual (tabela temporária) e cursor
Resultado:
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
neste exemplo vamos consultar uma tabela NxN Produto e Fornecedor, vamos listar todos os produtos e para cada produto vamos listar os seus fornecedores cadastrados, mas somente em uma única linha por produto separados por vírgula
neste exemplo também usaremos alguns recursos interessantes como tabela virtual (tabela temporária) e cursor
set nocount on --tabelas para testes create table produto (ID_PRODUTO int, NOM_PRODUTO varchar(50)) insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (1, 'PRODUTO 1') insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (2, 'PRODUTO 2') insert into produto (ID_PRODUTO, NOM_PRODUTO ) values (3, 'PRODUTO 3') create table fornecedor(ID_FORNECEDOR int, NOM_FORNECEDOR varchar(50)) insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (1, 'FORNECEDOR 1') insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (2, 'FORNECEDOR 2') insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (3, 'FORNECEDOR 3') insert into fornecedor (ID_FORNECEDOR, NOM_FORNECEDOR ) values (4, 'FORNECEDOR 4') create table forn_prod (ID_PRODUTO int, ID_FORNECEDOR int) insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 1) insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (2, 1) insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 2) insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (2, 2) insert into forn_prod (ID_PRODUTO, ID_FORNECEDOR ) values (1, 4) --tabela temporaria create table #temp (NOM_PRODUTO varchar(50), NOM_FORNECEDOR varchar(4000)) --select distinct para buscar somente produtos que estejam na tabela forn_prod --cursor x: produtos declare x cursor for select distinct forn_prod.ID_PRODUTO, NOM_PRODUTO from forn_prod inner join produto on produto.ID_PRODUTO = forn_prod.ID_PRODUTO --variaveis para o cursor x declare @ID_PRODUTO int declare @NOM_PRODUTO varchar(50) --variável para concatenar o nome dos fornecedores declare @NOM_FORNECEDOR_conc varchar(8000) open x fetch next from x into @ID_PRODUTO,@NOM_PRODUTO while @@fetch_Status=0 begin --zerando variável de concatenação set @NOM_FORNECEDOR_conc = '' --cursor y: fornecedores relacionados com os produtos, vai concatenar os fornecedores na variável @NOM_FORNECEDOR_conc declare y cursor for select NOM_FORNECEDOR from fornecedor inner join forn_prod on forn_prod.ID_FORNECEDOR = fornecedor.ID_FORNECEDOR where forn_prod.ID_PRODUTO = @ID_PRODUTO --variavel para o cursor y declare @NOM_FORNECEDOR varchar(50) open y fetch next from y into @NOM_FORNECEDOR while @@fetch_Status=0 begin --concatenando fornecedores na variável @NOM_FORNECEDOR_conc set @NOM_FORNECEDOR_conc = @NOM_FORNECEDOR_conc + @NOM_FORNECEDOR + ', ' --loop do cursor y fetch next from y into @NOM_FORNECEDOR end --fim do cursor y close y deallocate y --retira última virgula set @NOM_FORNECEDOR_conc = substring(@NOM_FORNECEDOR_conc, 1, len(@NOM_FORNECEDOR_conc)-1) --insere na tabela virtual insert into #temp (NOM_PRODUTO, NOM_FORNECEDOR ) values (@NOM_PRODUTO, @NOM_FORNECEDOR_conc) --loop do cursor x fetch next from x into @ID_PRODUTO,@NOM_PRODUTO end --fim do cursor x close x deallocate x --consulta da tabela temporaria select * from #temp --apagando tabela temporaria drop table #temp --apagando tabelas para testes drop table produto drop table fornecedor drop table forn_prod
Resultado:
NOM_PRODUTO NOM_FORNECEDOR
PRODUTO 1 FORNECEDOR 1, FORNECEDOR 2, FORNECEDOR 4 PRODUTO 2 FORNECEDOR 1, FORNECEDOR 2
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
Nenhum comentário:
Postar um comentário