次のようなクエリがあるとします。
SELECT *
FROM TABLE
そしてそれはこれを返します:
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
現在、このような適切な値のみを検索しようとするクエリがありますが、他の行に不正なVALを持つIDが含まれているため、欠陥があります。これは私が望んでいることではありません。
SELECT *
FROM TABLE
WHERE TABLE.VAL IN ("1","2","3")
これを返します(LMNOとPQRSがありません):
TABLE
ID | DATA | VAL
===============
01 | ABCD | 1
01 | DEFG | 2
02 | FGHI | 3
02 | HIJK | 2
03 | JKLM | 3
04 | NOPQ | 0
ただし、IDに不正な値がない行のみが必要です。したがって、01と02は、すべての行が良好な結果をもたらすため、問題ありません。03と04は、他の行の悪い結果に汚染されているため、悪いです。
結果をこのようにしてソフトウェアで処理することもできますが、これはデータベースで可能であるように思われます。原則として、データベースで実行する方がソフトウェアよりも優れています(ご存知のとおり、それは彼らがそこにいるようなものです...)
私が思いつくことができる最高のものはこれです:
SELECT *
FROM TABLE
WHERE COUNT( SELECT ID
FROM TABLE
WHERE TABLE.VAL NOT IN ("1","2","3")
) = 0
これは実行可能ですか?より良い代替案はありますか?
ありがとう!