Преобразовать НЕ В, чтобы НЕ СУЩЕСТВОВАТЬ - PullRequest
0 голосов
/ 07 апреля 2019

предположим, у меня есть этот кусок SQL:

SELECT DISTINCT p.id
FROM PERSON p, ROLE r1
WHERE p.id = r1.id 
AND r1.id NOT IN (
    SELECT DISTINCT r.id
    FROM ROLE r, RESTRICTION re
    WHERE r.title = re.title 
    AND r.production_year = re.production_year
    AND (re.description = 'U' OR re.description = 'G')
)

Я хочу преобразовать это в запрос, в котором вместо NOT IN NOT EXISTS.

Я сделал небольшую перестройку и сделал этот запрос, но он все еще не работал (я получил пустой набор по сравнению с результатом первого запроса, который возвратил 200 результатов (что правильно))

SELECT DISTINCT p.id
FROM PERSON p, ROLE r1
WHERE p.id = r1.id 
AND NOT EXISTS (
    SELECT DISTINCT r.id
    FROM ROLE r, RESTRICTION re
    WHERE r.title = re.title 
    AND r.production_year = re.production_year
    AND (re.description = 'U' OR re.description = 'G')
    AND r1.id <> r.id
)

Почему это не так? и что мне сделать, чтобы это исправить

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Я бы сформулировал это как JOIN в подзапросе.Таким образом, SELECT DISTINCT не требуется во внешнем запросе:

SELECT p.id
FROM PERSON p
WHERE NOT EXISTS (SELECT 1
                  FROM ROLE r JOIN
                       RESTRICTION re
                       ON r.title = re.title  AND
                          r.production_year = re.production_year
                  WHERE p.id = r.id AND
                        re.description IN ('U', 'G')
                 );

Я действительно удивлен, что условие JOIN между ROLE и PERSON включено ID.Но вы не предоставили примерные данные или макеты таблиц.

0 голосов
/ 07 апреля 2019

вам нужно конвертировать r1.id <> r.id в r1.id = r.id и использовать формат ANSI-92 SQL. Потому что вы можете сопоставить данные по равенству ключевых столбцов среди основного запроса и подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...