假设我有这段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
)
为什么这是错误的?以及我该怎么解决
答案 0 :(得分: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
上。但是您没有提供示例数据或表格布局。
答案 1 :(得分:0)
您需要将b >= 0
转换为r1.id <> r.id
并使用ansi-92 SQL格式。因为您可以通过主查询和子查询中的键列相等来匹配数据。