我有两个查询得到相同的结果,哪一个最有效?
型号:
Order {
orderId
}
OrderItem {
orderItemId
orderId
productId
}
Product {
productId
}
Order和OrderItem之间的关系是一对多,许多OrderItem与一个Product相关。
我想检索与特定产品相关的订单(在请求中使用参数productId)。
第一个使用内部联接的请求:
Select distinct o
from Order o
inner join OrderItem oi
on o.id =
oi.orderId and oi.productId = :productId
where子句中包含count子查询的第二个请求:
Select o
from Order o
where
(Select count oi
from OrderItem oi
where oi.orderId = o.id and oi.productId = :productId
) > 0
我也使用DB2和Hibernate。并且每个主键和外键上都有一个索引。
1条答案
按热度按时间s8vozzvw1#
您的查询无效。您必须说
SELECT column
而不是SELECT table
。我假设您想要这个。您需要一些简单明了的东西:返回一个表中满足连接表中某个条件的一组ID。
但是,除非在oi.orderId和o.Id之间存在强制的外键约束,否则这可能会为您获得一些额外的orderId:存在于OrderItem数据表中但不存在于Order数据表中的项目。
你的第一个例子是一个很好的方法--甚至是一个理想的方法--来克服这个异议。
第二个示例就不那么好了。它有一个相关子查询。也就是说,子查询引用了外部查询中表别名
o.id
中的一列。这意味着它必须对外部查询中的每一行重复计算子查询。这 * 不 * 可能比第一个查询快,即使使用银河系中最聪明的查询计划器也是如此。现在,如果希望
Order
表(SELECT o.*
)的所有列都与第二个表中的特定查询匹配,请使用下面的语句。这是从一个表中检索与另一个表中的某个条件相匹配的整行的最快方法。