类似于以下内容,编写select语句的最有效方法是什么。
SELECT * FROM Orders WHERE Orders.Order_ID not in (Select Order_ID FROM HeldOrders)
要点是,当项目不在另一张表中时,您希望从一张表中获得记录。
根据表大小,索引等等,“最有效”将有所不同。换句话说,它会根据您所使用的特定情况而有所不同。
根据情况,我通常使用三种方法来完成所需的操作。
1.如果为Orders.order_id编制了索引,并且HeldOrders很小,则您的示例可以正常工作。
2.另一个方法是“相关子查询”,它与您拥有的内容略有不同。
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需要在两个表中都建立索引。
3.我有时使用的另一种方法是左外连接…
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值,您可以过滤所有不匹配的内容。
这些变体中的每一个都可以在各种情况下或多或少地有效地工作。