#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 и использовать его. Потому что вы можете сопоставить данные по равенству ключевых столбцов в главном запросе и подзапросе.