Como extrair os idLotes que tem todas as mensagens com status=1

7 respostas
rodrigo.bossini

Pessoal,

To achando que isso que quero fazer é fácil mas to meio travado…seilá…talvez não seja tão fácil assim…enfim…

Tenho uma tabela lote e uma tabela mensagem.

Um lote possui N mensagens e uma mensagem pertence a um único lote.

Logo a tabela mensagem tem o campo idLote como chave estrangeira.

O que eu quero é pegar todos os lotes que tem todas as suas mensagens com idstatus=1.

Pensei em contar o número total de mensagens por lote e então contar o número de mensagens por lote que tem idstatus =1 e retornar somente os idlotes que tiverem essa condição igual.

Alguma luz?

7 Respostas

ctdaa

Dá para resolver num select único… algo assim:

SELECT idLote FROM lote
     WHERE idLote not exists in (SELECT idLote from mensagem WHERE idStatus <> 1 GROUP BY idLote) ;

A sintaxe pode variar dependendo do banco. Faça os testes aí…

rodrigo.bossini

ctdaa:
Dá para resolver num select único… algo assim:

SELECT idLote FROM lote
     WHERE idLote not exists in (SELECT idLote from mensagem WHERE idStatus <> 1 GROUP BY idLote) ;

A sintaxe pode variar dependendo do banco. Faça os testes aí…

Esse group by tá servindo pra que? Executei desse jeito e o banco(mysql) travou…

Tirei o group by e coloquei um distinct e o banco também travou…

pmlm

Não sei se percebi bem o que queres, será algo assim?

SELECT lt.idlote FROM lote lt
WHERE EXISTS (SELECT 1 FROM mensagem m WHERE m.idlote = lt.idlote and m.idstatus = 1)
ctdaa

Tem muitos registros nestas tabelas? Talvez seja bom complementar o where com mais criterios… tipo uma data…
Execute este trecho separado para ver o que retorna:

SELECT idLote from mensagem WHERE idStatus <> 1 GROUP BY idLote) ;

A intensão é pegar todos os lotes que tenham mensagem com status NAO 1. E depois o select completo vai selecionar os lotes que nao estao nesta lista.

rodrigo.bossini

Esse trecho retorna instantaneamente. Pra que tá servindo esse Group By?

ctdaa

O Group by era para “agrupar” resultados iguais porque como esta lendo a tabela de mensagens podem aparecer numeros de lotes repetidos. Acho que o DISTINCT tambem funcionaria.

ManoJava

Pra limitar as linhas repetidas use Rownum = 1

Criado 5 de fevereiro de 2010
Ultima resposta 5 de fev. de 2010
Respostas 7
Participantes 4