Select em duas tabelas - 1->N

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
betovivas
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 01 Jul 2010 2:03 pm
Localização: Salvador - BA

Olá pessoal,

Tenho essas duas tabelas e preciso do auxílio na seguinte consulta:

Selecionar tudo

CREATE TABLE 'pessoa' ('id' NUMBER(4) NOT NULL, 'nome' VARCHAR2(100 byte) NOT NULL,  'mês_nasc' VARCHAR2(2 byte) NOT NULL);

INSERT INTO 'pessoa' ('id', 'nome', 'mês_nasc') VALUES(1, 'Joao dos Santos', '07');
INSERT INTO 'pessoa' ('id', 'nome', 'mês_nasc') VALUES(2, 'Angelo Silva', '07');
INSERT INTO 'pessoa' ('id', 'nome', 'mês_nasc') VALUES(3, 'Maria Amélia', '06');
INSERT INTO 'pessoa' ('id', 'nome', 'mês_nasc') VALUES(4, 'Sandro de Jesus', '07');


CREATE TABLE 'vinculacao' ('id_pessoa' NUMBER(4) NOT NULL, 'vinculacao' VARCHAR2(3 byte) NOT NULL, 'data_vinc' DATE NOT NULL);

INSERT INTO 'vinculacao' ('id_pessoa', 'vinculacao', 'data_vinc') VALUES(1, 'U10', '2010-01-12');
INSERT INTO 'vinculacao' ('id_pessoa', 'vinculacao', 'data_vinc') VALUES(1, 'U30', '2010-05-27');
INSERT INTO 'vinculacao' ('id_pessoa', 'vinculacao', 'data_vinc') VALUES(2, 'U30', '2010-02-12');
INSERT INTO 'vinculacao' ('id_pessoa', 'vinculacao', 'data_vinc') VALUES(2, 'U10', '2010-05-30');
INSERT INTO 'vinculacao' ('id_pessoa', 'vinculacao', 'data_vinc') VALUES(3, 'U20', '2010-03-05');
A consulta seria:

Selecionar os campos:
id, nome, mês_nasc, vinculacao, data_vinc

Condições:
mês_nasc = '07'
vinculacao = 'U10' se for a que tem data_vinc mais recente.

A consulta deve retornar também os registros que estão na tabela pessoa e que possam não ter registros na tabela vinculacao.

A consulta retornaria:

Selecionar tudo

+-----------------------------------------------------------+
| id | nome            | mês_nasc | vinculacao | data_vinc  |
| 2  | Angelo Silva    | 07       | U10        | 2010-05-30 |
| 3  | Sandro de Jesus | 07       | Null       | Null       |
+-----------------------------------------------------------+
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

select id, nome, mês_nasc, vinculacao, data_vinc
from pessoa p,
        vinculacao v
where p.id = v.id_pessoa (+)
          and mês_nasc = '07' 
          and vinculacao = 'U10'
n entendi muito bem essa condição
vinculacao = 'U10' se for a que tem data_vinc mais recente.
mas acho q seria algo do tipo...

Selecionar tudo

select id, nome, mês_nasc, vinculacao, data_vinc
from pessoa p,
        vinculacao v
where p.id not in (select id_pessoa from vinculacao)
          and mês_nasc = '07' 
          and (v.data_vinc = (select max(data_vinc)  from vinculacao) and (v.vinculacao = 'U10' ))
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

Fazendo apenas um scan na tabela Vinculacao:

Selecionar tudo

SQL> SELECT id, nome, mês_nasc, vinculacao, data_vinc
  2    FROM pessoa p
  3    LEFT JOIN (SELECT id_pessoa,
  4                      vinculacao,
  5                      data_vinc,
  6                      row_number() over(PARTITION BY id_pessoa ORDER BY data_vinc DESC) rn
  7                 FROM vinculacao) v  ON v.id_pessoa = p.id
  8                                   AND rn = 1
  9   WHERE mês_nasc = '07'
 10     AND (vinculacao = 'U10' OR vinculacao IS NULL);
 
   ID NOME                                        mês_NASC VINCULACAO DATA_VINC
----- ------------------------------------------- -------- ---------- -----------
    2 Angelo Silva                                07       U10        30/5/2010
    4 Sandro de Jesus                             07                  
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

Ah, sim, quase me esqueço... obrigado por postar o código para criação das tabelas e os inserts de dados, assim como mostrar de forma simples o resultado esperado.

Facilita muito o entendimento e a construção da solução. :D

Abraço,
Francisco.
betovivas
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 01 Jul 2010 2:03 pm
Localização: Salvador - BA

Francisco e Victor,

Agradeço muito a ajuda de vocês...

Vou testar as consultas e posto os resultados.

Valeu mesmo.

Um abraço

Roberto Vivas
Salvador-BA
betovivas
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 01 Jul 2010 2:03 pm
Localização: Salvador - BA

Francisco,

Valeu mesmo!

O Select funciou. Observei que os dados da linha 8 estavam no lugar errado, mas ajustei e funcionou.

Mais uma vez obrigado.

Roberto Vivas
Responder
  • Informação
  • Quem está online

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