Не существует, давая ноль строк - PullRequest
0 голосов
/ 02 мая 2020

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

Задача состоит в том, чтобы найти каждый номер счета который никогда не был назначен ни одной позиции в таблице invoice_line_items:

Правильный запрос:

SELECT 
    account_number, account_description
FROM
    general_ledger_accounts gl
WHERE
    NOT EXISTS( SELECT 
            account_number
        FROM
            invoice_line_items
        WHERE
            gl.account_number = account_number);

И если я удаляю gl.account_number = account_number, он возвращает ноль строк.

Я хочу знать: 1) Почему в подзапросе требуется оператор gl.account_number = account_number.
2) Чем отличается процесс выбора в Not In и Not Exists.

1 Ответ

0 голосов
/ 02 мая 2020

Вы должны написать это, используя квалифицированные ссылки на столбцы в запросе. Кроме того, select в подзапросе не имеет значения, поэтому я обычно использую 1:

SELECT gl.account_number, gl.account_description
FROM general_ledger_accounts gl
WHERE NOT EXISTS (SELECT 1
                  FROM invoice_line_items ili
                  WHERE gl.account_number = ili.account_number
                 );

Подзапрос - это коррелированный подзапрос , поскольку предложение where соединяет внутренний подзапрос на ili к внешнему подзапросу на gl. Концептуально, это проходит через каждую учетную запись в gl. Предложение where оценивается как true, когда ни одна строка не соответствует определенному account_number.

Это похоже на NOT IN, за исключением - как вы сами указываете - когда подзапрос NOT IN возвращает NULL для любой ряд.

...