Преобразовать НЕ В НЕ СУЩЕСТВУЕТ

#mysql #sql

#mysql #sql

Вопрос:

предположим, у меня есть этот фрагмент 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')
)
  

Я хочу преобразовать это в запрос, где вместо НЕ В НЕ СУЩЕСТВУЕТ.

Я произвел небольшую корректировку и сделал этот запрос, но он все равно не сработал (я получил пустой набор по сравнению с результатом первого запроса, который вернул 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
)
  

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

Комментарии:

1. Попробуйте изменить r1.id <> r.id на r1.id = r.id , вы хотите сказать, где не существует никакой записи where для этого идентификатора ( r1.id )

Ответ №1:

Я бы сформулировал это с помощью 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 . Но вы не предоставили образцы данных или макеты таблиц.

Ответ №2:

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