В основном запрос ищет значения в table1
, где не существует значения в table2
, где комбинация table1.snumber
и table2.pnumber
не существует в table3
.Таким образом, в основном он хочет получить все значения в table1
, где в table3
есть строка, которая связывает snumber
с каждым pnumber
в table2
.
Другим, возможно, более простым для понимания способомнаписания запроса использует JOIN
s и подсчет количества строк в выводе.Предложение HAVING
проверяет, что количество строк для данного snumber
в результате JOIN
совпадает с общим числом строк в table2
, то есть запись существует в table3
для каждой комбинации этогоsnumber
и значения pnumber
в table2
:
SELECT t1.snumber
FROM table1 t1
JOIN table3 t3 ON t3.snumber = t1.snumber
JOIN table2 t2 ON t2.pnumber = t3.pnumber
GROUP BY t1.snumber
HAVING COUNT(*) = (SELECT COUNT(*) FROM table2)
Вывод (для обоих запросов)
snumber
s1
Демонстрация по SQLFiddle