2

我有下表

Prod_id   Units sold
 1,       100 
 2,       95 
 3,       84 
 4,       95 
 5,       100 

我想知道为什么第一个查询给出正确的行数,而第二个查询只返回 1

select 
 (ROW_NUMBER() OVER (Partition by amount order by id)) 
from Products 


select *, 
(select ROW_NUMBER() OVER (Partition by amount order by id) a )  
from Products 

结果在这里:http ://sqlfiddle.com/#!6/dfd59/11

我想使用它在不使用语句的情况下将 100、100 第一和第五行以及 95、95 应用于此查询中的第二和第四行with。请让我知道是否有办法

4

1 回答 1

2

编写没有from子句的子查询是对子查询的浪费。它没有做任何可取的事情。

直接调用函数即可。

注意:此建议适用于子查询中的任何表达式,而不仅仅是row_number().

为什么您的子查询只返回“1”?这个原因很难解释。但是,想象一下子查询被写成:

select *, 
       (select ROW_NUMBER() OVER (Partition by amount order by id) a
        from dual)  

事实上,这就是查询可以或将如何写入多个 SQL 数据库的方式。 dual是一个只有一行的表。这个小事实强调了正在发生的事情。子查询一次引用一行。因此,row_number()您得到的仅指按该行进行分区。瞧!你只会得到“1”。

我意识到如果您将子查询视为:

select *, 
       (select ROW_NUMBER() OVER (Partition by amount order by id) a
        from (select products.amount, products.id) p
       )  

这强调了row_number()正在应用于子选择的结果集。该子选择 - 根据定义 - 只有一行,这导致返回“1”。

于 2018-01-19T21:04:34.930 回答