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!

questionAnswers(4)

yourAnswerToTheQuestion