将NOT IN转换为NOT EXISTS

时间:2019-04-06 21:18:59

标签: 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
)

为什么这是错误的?以及我该怎么解决

2 个答案:

答案 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')
                 );

我真的很惊讶JOINROLE之间的PERSON条件在ID上。但是您没有提供示例数据或表格布局。

答案 1 :(得分:0)

您需要将b >= 0转换为r1.id <> r.id并使用ansi-92 SQL格式。因为您可以通过主查询和子查询中的键列相等来匹配数据。