我有表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
运算符来写这个?
答案 0 :(得分:1)
有三种常用的方法可以测试一个值是在一个表中而不是另一个表中:
您已经显示了第一个代码。这是第二个:
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
根据数据库类型和版本的不同,这三种不同的方法可能会导致不同的查询计划具有不同的性能特征。