有没有其他方法来编写此查询?

时间:2010-06-06 23:03:22

标签: sql exists

我有表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运算符来写这个?

1 个答案:

答案 0 :(得分:1)

有三种常用的方法可以测试一个值是在一个表中而不是另一个表中:

  • NOT EXISTS
  • 不在
  • LEFT JOIN ... WHERE ... IS NULL

您已经显示了第一个代码。这是第二个:

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

根据数据库类型和版本的不同,这三种不同的方法可能会导致不同的查询计划具有不同的性能特征。