我有表 A、B、C,其中 A 表示可以在 C 中存储零个或多个子项目的项目。B 表只有 2 个外键来连接 A 和 C。
我有这个 sql 查询:
select * from A
where not exists (select * from B natural join C where B.id = A.id and C.value > 10);
其中说:“给我表 A 中所有子项的值都小于 10 的每一项。
有没有办法优化这个?有没有办法不使用exists
运算符来编写它?
有三种常用的方法来测试一个值是否在一个表中但不在另一个表中:
您已经展示了第一个的代码。这是第二个:
SELECT *
FROM A
WHERE id NOT IN (
SELECT b.id
FROM B
NATURAL JOIN C
WHERE C.value > 10
)
并使用左连接:
SELECT *
FROM A
LEFT JOIN (
SELECT b.id
FROM B
NATURAL JOIN C
WHERE C.value > 10
) BC
ON A.id = BC.id
WHERE BC.id IS NULL
根据数据库类型和版本,这三种不同的方法可能会导致具有不同性能特征的不同查询计划。