Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rcoltrane

select

Recommended Posts

Pessoal, tenho uma situação aqui que está me tirando o sono, vejam se podem me ajudar:

 

Tenho duas tabelas que estão relacionadas por uma chave e para cada item da tabela pai, tenho varios registros na tabela filho. Só que na consulta, para cada item da tabela pai, preciso pegar apenas o item mais recente da tabela filho. Por exemplo:

 

Tabela PAI: Tabela Filho:

 

chave: item: id: chave: descricao:

1 aaa 1 1 teste1

2 bbb 2 1 teste2

3 ccc 3 2 teste3

4 ddd 4 1 teste4

 

 

no caso acima, eu precisaria pegar o item 1 da primeira tabela e somente o item mais recente (de maior id) na tabela filho, que no caso, seria o id 4 - teste4. Mas fazendo isso para todos os itens da tabela pai. Como posso fazer esta busca?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Pensei nisso, mas como eu estruturaria esta subconsulta? Minha consulta atual é esta abaixo:

 

SELECT vagas.id_vaga, vagas.data_abertura, vagas.data_fech_cancel, vagas.qtde_vagas, "
vagas.valor_salario, status.status_vaga, titulos_vagas.tit_vaga, "
usuarios.nome, usuarios.unidade, clientes.cliente, "
detalhe_status.detalhe_status, "
vagas.taxa_selecao, vagas.taxa_cancel "
FROM vagas, status, detalhe_status, titulos_vagas, usuarios, clientes "
WHERE status.id_status_vaga = vagas.status_vaga and "
detalhe_status.id_vaga = vagas.id_vaga and "
titulos_vagas.id_tit_vaga = vagas.tit_vaga and "
usuarios.id_usuario = vagas.consultor and "
clientes.id_cliente = vagas.cliente and "
usuarios.unidade = " & varUnid & " and "
vagas.tipo_vaga <> 2 and "
vagas.tipo_vaga <> 5 and "
vagas.status_vaga = 4 and "
vagas.taxa_cancel <> 0 and "
vagas.data_fech_cancel < to_date( '" & varDTin & "', 'dd/mm/yyyy') and "
vagas.data_fech_cancel > to_date( '" & varDTin - 180 & "', 'dd/mm/yyyy') and "
vagas.id_vaga NOT IN(SELECT vaga FROM nf) ORDER BY vagas.id_vaga DESC"
No caso, a tabela pai é a vagas e a tabela filho é a detalhe_status. Então eu teria que neste caso pegar o MAX da tabela detalhe_status para cada id_vaga da tabela vagas. Como faço isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta fazer o subselect com a tabela que terá a coluna com o max, crie um ALIAS para diferenciar as duas instâncias da tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu inclui a subquery do jeito que você sugeriu (vide abaixo) e os registros da tabela detalhe_status vieram corretamente. Mas está acontecendo algo estranho: ele não está trazendo todos os registros que estava trazendo anteriormente. Com a subquery MAX inserida, ele está trazendo um registro e pulando outro intercaladamente! Percebi isso porque ele deveria estar trazendo 7 registros, mas com a subquery, ele trouxe apenas 4, intercalando.

 

SELECT vagas.id_vaga, vagas.data_abertura, vagas.data_fech_cancel, vagas.qtde_vagas,
vagas.valor_salario, status.status_vaga, titulos_vagas.tit_vaga,
usuarios.nome, usuarios.unidade, clientes.cliente,
detalhe_status.detalhe_status,
vagas.taxa_selecao, vagas.taxa_cancel
FROM vagas, status, detalhe_status, titulos_vagas, usuarios, clientes
WHERE status.id_status_vaga = vagas.status_vaga and
detalhe_status.id_detalhe_status = (SELECT MAX (id_detalhe_status) FROM detalhe_status ds WHERE ds.id_vaga = vagas.id_vaga) and
detalhe_status.id_vaga = vagas.id_vaga and
titulos_vagas.id_tit_vaga = vagas.tit_vaga and
usuarios.id_usuario = vagas.consultor and
clientes.id_cliente = vagas.cliente and
usuarios.unidade = " & varUnid & " and
vagas.tipo_vaga <> 2 and
vagas.tipo_vaga <> 5 and
vagas.status_vaga = 4 and
vagas.taxa_cancel <> 0 and
vagas.data_fech_cancel < to_date( '" & varDTin & "', 'dd/mm/yyyy') and
vagas.data_fech_cancel > to_date( '" & varDTin - 180 & "', 'dd/mm/yyyy') and
vagas.id_vaga NOT IN(SELECT vaga FROM nf) ORDER BY vagas.id_vaga DESC
O que estou fazendo de errado agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a chave de detalhe_status ?!

 

A chave primaria da tabela detalhe_status é o campo id_detalhe_status (campo com autonumeração, não permite repetição) e a chave estrangeira da tabela detalhe_status é o campo id_vaga, o qual eu uso para relacionar esta tabela com a tabela vagas (vagas.id_vaga).

 

E o campo que eu trago na consulta principal é o campo detalhe_status.detalhe_status mais atual, ou seja, fazendo o max do campo id_detalhe_status que será sempre o status mais atual daquela determinada vaga. Só que por alguma razão obscura ele está pulando registros quando insiro a subquery.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a chave é só esta deveria funcionar.

 

Rode a query sem o subselect e ordene também pelo detalhe_status para ver se é isto mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se a chave é só esta deveria funcionar.

 

Rode a query sem o subselect e ordene também pelo detalhe_status para ver se é isto mesmo.

 

Deu certo! Tirei a subquery e coloquei no final para ordenar as duas tabelas em ordem decrescente e funcionou. Ficou assim:

 

... ORDER BY vagas.id_vaga DESC, detalhe_status.id_detalhe_status DESC

 

Muito obrigado pela ajuda Motta! Estou marcando este tópico como resolvido. Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.