该查询在做什么?

时间:2019-01-30 17:38:50

标签: mysql sql database

我有下表:

PRODUCT ( ProdId, Name, Price, Weight, Category, Description, … )
DETAIL ( OrdId, ProdId, Qty, … )
ORDER ( OrdId, ClientId, Amount, OrdDate, DeliveryDate, ChosenStoreId, … )

并且我必须用简单的词(即非程序员)来描述以下查询在做什么:

select * from Order O
where Amount < 0.95 * ( select sum( Qty * Price ) from Product natural join Detail
where OrderId = O.OrderId )

我的最初回应是,它显示的订单金额最低,仅为订单的5%,但被标记为不正确。

我还以为另一个想法可能是折扣,但是练习说明中没有提及折扣,因此我猜它也是不正确的。

有人可以告诉我查询在做什么吗?预先感谢。

注意:除了表格以外,这是我查询所需要的所有相关信息。

2 个答案:

答案 0 :(得分:1)

我不同意"gtol": 1e-7 * n,但这是一个单独的问题。

这是返回行,其中订单的natural join小于订单上商品价格总和的95%。

导致差异的原因尚不清楚-可能是由于amount级的折扣所致;这可能是由于额外的费用,例如税收或运输;否则可能还有其他原因。

答案 1 :(得分:1)

关于戈登,我也不赞成natural join。该查询似乎是有意的,特别是因为没有示例数据。一个好的策略是用更通用的语法写出SQL并进行推断,请参见下文:

select o.OrdId,
       sum(o.Amount) Amount,
       sum(d.Qty * p.Price) QtyPrice

from Order as o
  left join Detail as d on d.OrdId = o.OrdId
  left join Product as p on p.ProdId = d.ProdId

group by o.OrdId

having sum(o.Amount) < (0.95 * sum(d.Qty * p.Price))

对我来说,此查询返回

  1. 系统中的所有唯一订单
  2. 订单收取的金额少于预期金额的95%。

就像您说的那样,这可能是折扣跟踪器,或者o.Amount字段是独立于DetailProduct表填充的,并且显示任何错误。