Excluir linhas com base em outras linhas (SQL)
Digamos que eu tenha uma consulta como esta:
SELECT *
FROM TABLE
E retorna isso:
TABLE
ID | DATA | VAL
===============
01 | ABCD | 1
01 | DEFG | 2
02 | FGHI | 3
02 | HIJK | 2
03 | JKLM | 3
03 | LMNO | 4
04 | NOPQ | 0
04 | PQRS | 1
Atualmente, tenho uma consulta que tenta encontrar apenas bons valores como esse, mas é falha porque estão incluídos IDs com valores inválidos em outras linhas, o que não é o que eu gostaria.
SELECT *
FROM TABLE
WHERE TABLE.VAL IN ("1","2","3")
retornaria isso (com LMNO e PQRS ausentes):
TABLE
ID | DATA | VAL
===============
01 | ABCD | 1
01 | DEFG | 2
02 | FGHI | 3
02 | HIJK | 2
03 | JKLM | 3
04 | NOPQ | 0
No entanto, eu só quero linhas em que o ID NÃO possui valores inválidos. Portanto, 01 e 02 são bons porque todas as suas linhas têm bons resultados. 03 e 04 são ruins porque estão contaminados pelos maus resultados em outras linhas.
Eu poderia trazer o resultado dessa maneira e processá-lo dessa maneira em software, mas parece que isso deveria ser possível com um banco de dados e, como regra geral, fazê-lo no banco de dados é melhor do que em software (você sabe, é para isso que eles servem ...)
O melhor que eu poderia fazer é:
SELECT *
FROM TABLE
WHERE COUNT( SELECT ID
FROM TABLE
WHERE TABLE.VAL NOT IN ("1","2","3")
) = 0
Isso é viável? Existe uma alternativa melhor?
Obrigado!