Несколько НЕ СУЩЕСТВУЕТ SQL - PullRequest
       38

Несколько НЕ СУЩЕСТВУЕТ SQL

0 голосов
/ 01 декабря 2018

Мне очень трудно понять это утверждение.Может кто-нибудь объяснить мне, как отследить или сказать мне порядок операций, почему я получаю возвращаемый результат.

SELECT snumber
FROM table1
WHERE NOT EXISTS(
   SELECT *
   FROM table2
   WHERE NOT EXISTS(
        SELECT *
        FROM table3
        WHERE table1.snumber = table3.snumber
        AND table2.pnumber = table3.pnumber));

table1        table2      table3
snumber       pnumber     snumber    pnumber
s1            p1          s1         p1
s2            p2          s1         p2
s3            p3          s1         p3
s4                        s2         p1
s5                        s2         p32
                          s3         p1
                          s3         p2
                          s4         p1
                          s4         p2
                          s5         p1

Результат возвращает только s1, за которым я не следую.На данный момент это мой мыслительный процесс.Подзапрос нижнего уровня возвращает false.Что заставляет подзапрос среднего уровня ничего не выбирать.Так как там ничего нет, верхний уровень - это правда.Это приведет к тому, что верхний уровень выберет все в таблице 1.

Я искал повсюду примеры этого, но, похоже, ничего не могу найти.Я действительно ценю любую помощь.

1 Ответ

0 голосов
/ 01 декабря 2018

В основном запрос ищет значения в 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

...