2010-06-06 49 views
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); 

它说:“给我从表格中的每一个项目,所有子项具有值小于10

有没有办法来优化这一点,有没有写这个办法?不使用exists运营商?

回答

1

有三种常用的方法来测试,如果发现某个值在一个表中,但不是另一个:

  • NOT EXISTS
  • NOT IN
  • 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 

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

相关问题