Query Hierarquica

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Tenho uma tabela com chave-primária composta, cuja qual tem a finalidade de gravar os email de fornecedores. Sendo assim esta tabela me permite gravar um ou mais registros para o mesmo fornecedor, ou seja, um mesmo fornecedor terá um ou vários emails. Porém a forma como ela foi criada os registros ficam todos na mesma tabela. Por isso ao fazer uma consulta na mesma por um dos campos da chave, por exemplo o código, me é retornado todos os emails do fornecedor e a coluna com a descrição do fornecedor.

Por isso, por gentileza, gostaria de saber se através do recursos CONNECT BY eu consigo exibir apenas uma vez o nome do fornecedor e abaixo do nome listar todos os emails do mesmo?

Grato.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá TInho,

Pode passar uma descrição resumida da(s) tabela(s), composta somente dos campos que você mencionou?

Se tiver pelo menos 3 registros de exemplo para carragar nesta tabela, talvez o pessoal possa ter mais subsídios para lhe dar uma opinião.

Abraços,

Sergio Coutinho
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

Tinho,

Sugiro a leitura do artigo: http://www.fabioprado.net/2011/06/consu ... eries.html.

[]s
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Senhores,

Na verdade esta é uma tabela com auto-relacionamento. Aquela cuja a qual possui a chave primaria e estrangeira na mesma tabela, ou seja, você tem o registro mestre com todos os seus detalhes, sendo que as linhas dos registros dependentes da chave possui um identificador e a coluna que representa a chave-primaria nos registros seguintes é nula. A ligação destes registros são feitas via connect by.

Honestamente, não sou muito a favor de usar estes tipos de tabela, pois não vejo utilidade diantes das funcionalidades relacionais e além de não conseguir encaixar este conceito dentro das formas normais. Mas como não fui eu quem fez a modelagem...

Sei que este modelo era muito aplicado em banco de dados hierárquicos, quando não existia tabelas relacionais. Por isso, abri o tópico como Query Hierárquica. Dessa forma gostaria de saber como utilizar o CONNECT BY afim de trazer o registro mestre na primeira linha, seguido logo abaixo de seus dependentes.

Grato pela força.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tem casos que eu fiz o seguinte:
* Transformei uma tabela hierarquica em uma tabela COMUM. (usei connect-by e inseri numa Global Temporary Table). Dai facilitou muito o meu trabalho, porque eu só usei CONNECT BY uma vez no programa. Depois eu podia usar a minha GTT pra cálculos complexos.

(talvez o seu caso isso não seja possível né)
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Bom... como não tenho o exemplo da tabela (nomes das colunas, data types, dados relevantes, etc), segue um palpite que fiz aqui com função de agregação, assumindo que você queira apenas uma linha para cada fornecedor:

Selecionar tudo

SQL> with t as (
  2  select 1 cod_fornecedor, 'FULANO LTDA' nome_fornecedor, 11112222 tel_fornecedor from dual union all
  3  select 1 cod_fornecedor, 'FULANO LTDA' nome_fornecedor, 11112222 tel_fornecedor from dual union all
  4  select 1 cod_fornecedor, 'FULANO LTDA' nome_fornecedor, 11112222 tel_fornecedor from dual union all
  5  select 2 cod_fornecedor, 'JUCA' nome_fornecedor, 99991234 tel_fornecedor from dual)
  6  -- fim dos dados de exemplo
  7  select t.cod_fornecedor,
  8         t.nome_fornecedor,
  9         listagg(tel_fornecedor, '; ') -- segundo parâmetro é o separador
 10                 within group (order by 1)-- trocar o número 1 pela(s) coluna(s) que você queira usar para ordenar
 11                   lista_fones
 12    from t
 13   group by t.cod_fornecedor, t.nome_fornecedor;

COD_FORNECEDOR NOME_FORNEC LISTA_FONES
-------------- ----------- ------------------------------
             1 FULANO LTDA 11112222; 11112222; 11112222
             2 JUCA        99991234
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes