Select sem repetir informações

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal é o seguinte.
Tenho uma tabela com a seguinte estrutura:

tabela_1
contrato number,
plano number

O que acontece é que um mesmo contrato pode ter mais de um plano.

Selecionar tudo

CONTRATO    PLANO
==============
 1                   1
 1                   2
 2                   2
 2                   1
O que preciso é selecionar em uma mesma linha o contrato e seus dois planos distintos. Conforme o select abaixo:

Selecionar tudo

select t.contrato, t.plano, t2.plano
from tabela1 t, tabela1 t2
where t.contrato = t2.contrato and t.plano <> t2.plano
O porém é que esse select me resulta algo assim:

Selecionar tudo

CONTRATO    PLANO    PLANO
 ====================
 1                    1             2
 1                    2             1
 2                    2             1
 2                    1             2
Ou seja, ele repete as loinhas apenas invertendo a ordem. Analisando o select é até obvio que isso aconteça. Queria uma ideia de como fazer esse select para que não repita os contratos.

OBS: Cada contrato terá no maximo 3 planos.

Obrigado.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara se tu quer ver todos os planos de um contrato ele sempre ira repetir pois a tua relação é 1-N.

O que da pra fazer é trabalhar em cima dos resultados da query.
Como tu gostaria que os resultados saíssem?
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Eu gostarai que saissem assim:

Selecionar tudo

CONTRATO    PLANO    PLANO
 ====================
 1                    1             2
 1                    2             1 <-- essa linha não apareceria porque já foi exibida acima
 2                    2             1
 2                    1             2< -- mesmo caso dessa linha 
gostaria que o resultado noa aparecesse as linhas q mencionei acima, pois se formos ver é a mesma informação só que em ordem inversa, já que são os mesmos planos.

Queria ver se há uma jeito de exibir somente uma vez cada contrato.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Ta mas tu colocou que pode haver uma terceira conta, nesse caso continuaria aparcendo apenas uma linha, porém uma terceira coluna???
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Sim, seria uma terceira coluna.

Mas eu fiz dessa forma porque eu não consegui concatenar com um select.

Pode ser assim também:

Selecionar tudo

CONTRATO     PLANO
====================
 1          1,2,3
Vlw.
dudu0566
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 74
Registrado em: Seg, 06 Ago 2007 3:59 pm
Localização: Campinas - SP
Eduardo Gomes

Tente este código:

Selecionar tudo

select contrato,
	substr(max(replace(sys_connect_by_path(plano, '|')
			  , '|'
			  , ';' /*delimitador*/
			  )
		   ) /*max para agrupar*/
	       ,2  /*length do delimitador +1*/
	       ) "PLANO(S)" /*substr para eliminar o delimitador no início do registro*/
   from (select a.*,
		row_number() over (partition by a.contrato order by a.contrato, a.plano) row#
	   from (select e.contrato, e.plano from exemplo e ) a)
  start with row# = 1
connect by prior contrato = contrato
       and prior row# = row# -1
  group by contrato
  order by contrato;
Resultado

Selecionar tudo

CONTRATO PLANO(S)
1                                 1;2;3
2                                 1;2;3
3	                	   1
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

MESTRE, é isso aew cara.

Vlw mesmo.

Funcionou perfeito.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

To ficando velho e enferrujado :P código loko esse abaixo!
dudu0566 escreveu:Tente este código:

Selecionar tudo

select contrato,
	substr(max(replace(sys_connect_by_path(plano, '|')
			  , '|'
			  , ';' /*delimitador*/
			  )
		   ) /*max para agrupar*/
	       ,2  /*length do delimitador +1*/
	       ) "PLANO(S)" /*substr para eliminar o delimitador no início do registro*/
   from (select a.*,
		row_number() over (partition by a.contrato order by a.contrato, a.plano) row#
	   from (select e.contrato, e.plano from exemplo e ) a)
  start with row# = 1
connect by prior contrato = contrato
       and prior row# = row# -1
  group by contrato
  order by contrato;

Resultado

Selecionar tudo

CONTRATO PLANO(S)
1                                 1;2;3
2                                 1;2;3
3	                	   1
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Show de bola.

Salva na pasta de scripts, pra da uma praticada mais tarde.

Parabéns
Responder
  • Informação
  • Quem está online

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