1

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

4

1 回答 1

1

有三种常用的方法来测试一个值是否在一个表中但不在另一个表中:

  • 不存在
  • 不在
  • 左连接 ... WHERE ... 为空

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

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

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

于 2010-06-06T23:07:49.587 回答