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

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?

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í…

[quote=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í…[/quote]

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…

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)

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.

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

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.

Pra limitar as linhas repetidas use Rownum = 1