sql – 使用“not in”子查询编写select语句的最有效的方式是什么?

编写类似下面的select语句的最有效的方式是什么?
SELECT *
FROM Orders
WHERE Orders.Order_ID not in (Select Order_ID FROM HeldOrders)

当项目不在另一个表格中时,您希望从一个表格中获取记录.

解决方法

“最有效率”将根据表的大小,索引等而有所不同.换句话说,它将根据您使用的具体情况而有所不同.

根据情况,通常使用三种方式来完成所需的任务.

1.如果Orders.order_id被索引,并且HeldOrders相当小,您的示例工作正常.

另一个方法是“相关子查询”,这是你所拥有的一个微小的变化

SELECT *
FROM Orders o
WHERE Orders.Order_ID not in (Select Order_ID 
                              FROM HeldOrders h 
                              where h.order_id = o.order_id)

注意添加where子句.当HeldOrders有大量行时,这样做往往会更好. Order_ID需要在两个表中进行索引.

有时我使用另一种方法是外连接…

SELECT *
FROM Orders o
left outer join HeldOrders h on h.order_id = o.order_id
where h.order_id is null

当使用左外连接时,当有匹配的行时,h.order_id将具有匹配o.order_id的值.如果没有匹配的行,h.order_id将为NULL.通过检查where子句中的NULL值,您可以对没有匹配项的所有内容进行过滤.

这些变化中的每一个可以在各种情况下或多或少地有效地工作.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03