首页 > 解决方案 > 稍作修改的 SQL 查询给出不同的结果

问题描述

我正在学习 SQL 并使用分析功能做一些练习。我有以下查询来找出最高ship_nameorder_value订单。以下是我的表格:

orders(id, ship_name, city_of_origination)
order_details(id, order_id, unit_price, quantity)

为了解决这个问题,我写了以下查询:

select o.ship_name, od.quantity*od.unit_price, first_value(od.quantity*od.unit_price) over (order by od.quantity*od.unit_price desc)
from orders o
inner join order_details od
on o.order_id = od.order_id
limit 1 

limit在上面的查询中删除后的示例输出如下:

上述查询结果

稍微改变一下问题陈述,我只想要ship_name。所以我写了这个查询:

select tmp.ship_name
from (select o.ship_name as ship_name, first_value(od.quantity*od.unit_price) over (order by od.quantity*od.unit_price desc) fv 
      from orders o
     inner join order_details od
      on o.order_id = od.order_id
      limit 1
     ) tmp;

令我惊讶的是,结果发生了变化。这是上面没有 wuery 的结果limit上述查询结果

同时,如果我执行以下查询:


select tmp.ship_name, tmp.fv
from (select o.ship_name as ship_name, first_value(od.quantity*od.unit_price) over (order by od.quantity*od.unit_price desc) fv 
      from orders o
     inner join order_details od
      on o.order_id = od.order_id
      limit 1
     ) tmp;

我得到与第一个查询相同的结果(和预期的结果)。我的问题是:为什么上述查询的结果有所不同?

标签: sqlpostgresql

解决方案


limitorder by返回任意行。在后续执行时,它甚至可能不会为同一查询返回同一行。

因此,用于order by控制返回哪一行。


推荐阅读