rcoltrane 0 Denunciar post Postado Março 12, 2014 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
Motta 645 Denunciar post Postado Março 12, 2014 Tente um subselect com MAX. Compartilhar este post Link para o post Compartilhar em outros sites
rcoltrane 0 Denunciar post Postado Março 12, 2014 Tente um subselect com MAX. 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
Motta 645 Denunciar post Postado Março 12, 2014 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
rcoltrane 0 Denunciar post Postado Março 12, 2014 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
Motta 645 Denunciar post Postado Março 12, 2014 Qual a chave de detalhe_status ?! Compartilhar este post Link para o post Compartilhar em outros sites
rcoltrane 0 Denunciar post Postado Março 12, 2014 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
Motta 645 Denunciar post Postado Março 12, 2014 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
rcoltrane 0 Denunciar post Postado Março 12, 2014 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
Motta 645 Denunciar post Postado Março 12, 2014 Ok, mas não estaria filtrando o maior. Compartilhar este post Link para o post Compartilhar em outros sites