一尘不染

用“输入”子查询编写选择语句的最有效方法是什么?

sql

类似于以下内容,编写select语句的最有效方法是什么。

SELECT *
FROM Orders
WHERE Orders.Order_ID not in (Select Order_ID FROM HeldOrders)

要点是,当项目不在另一张表中时,您希望从一张表中获得记录。


阅读 118

收藏
2021-03-17

共1个答案

一尘不染

根据表大小,索引等等,“最有效”将有所不同。换句话说,它会根据您所使用的特定情况而有所不同。

根据情况,我通常使用三种方法来完成所需的操作。

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值,您可以过滤所有不匹配的内容。

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

2021-03-17