Проблемы с пониманием этого запроса EXISTS

Таблица acc_account Пример данных:

acc_id  acc_code  parent  name
------- --------- ------ ------
 1     | aaa     |  -1  |  A   |
 2     | bbb     |  CP  |  B   |
 3     | ccc     |  OP  |  C   |
 4     | ddd     |  -1  |  D   |

Колонны acc_code а также parent не равны верно?

В таблице 411 строк, и даже нет записей acc_code это соответствует parent колонка.

Однако этот запрос ниже возвращает 6 строк, когда должно быть все 411 строк. Кто-нибудь может объяснить?

Запрос (возвращает 6 строк):

   SELECT *
    FROM acc_account a1
    WHERE not EXISTS (
        SELECT *
        FROM acc_account
        WHERE acc_account.parent = a1.acc_code
   );

1 ответ

Решение

Допустим, вы получили следующий набор:

acc_id  acc_code  parent  name
------- --------- ------ ------
 1     | aaa     |  -1  |  A   |
 2     | bbb     |  CP  |  B   |
 3     | ccc     |  OP  |  C   |
 4     | ddd     |  -1  |  D   |
 5     | CP      |  -1  |  E   |

Ваш запрос вернет запись с acc_id = 5, потому что acc_code = CP существует как parent в записи с acc_id = 2

Для поиска в записи вы можете изменить свой запрос следующим образом:

SELECT *
FROM acc_account a1
WHERE not EXISTS (
                   SELECT *
                   FROM acc_account
                   WHERE acc_account.parent = a1.acc_code
                       AND acc_account.id = a1.id
                 );

Или намного проще:

SELECT *
FROM acc_account a1
WHERE a1.parent = a1.acc_code

Я только что заметил, что вы ищете NOT exists Таким образом, логика, описанная здесь, наоборот.

Другие вопросы по тегам