Say У меня есть запрос, как это:Исключить строки на основе других строк (SQL)
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 в других строках, включены, что не то, что мне хотелось бы.
SELECT *
FROM TABLE
WHERE TABLE.VAL IN ("1","2","3")
бы это вернуть (с LMNO и ФХЦЧ отсутствует):
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
является ли это жизнеспособным? Есть ли лучшая альтернатива?
Спасибо!
Для какой базы данных и версии? –