编写类似下面的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值,您可以对没有匹配项的所有内容进行过滤.
这些变化中的每一个可以在各种情况下或多或少地有效地工作.