SQL - 引用 'FROM' 子查询列

SQL - referring to a 'FROM' subquery column

以这段代码为例,选取每年订单量最高的:

SELECT *
FROM (
   SELECT year(OrderDate) AS y, month(OrderDate) AS m, 
          count(orderID) ccc,
          ROW_NUMBER() OVER (PARTITION BY YEAR(OrderDate) ORDER BY count(orderID) DESC) AS rn
    FROM Orders o
    group by year(OrderDate), month(OrderDate)
    ) oo
WHERE oo.rn = 1

我不明白 [WHERE oo.rn = 1] 是如何工作的。

因为,从逻辑上讲,列 rn(行号)指的是 table 中别名为 'o' 的列(在子查询中),而不是 table 中的列别名 'oo'(在一般查询中)。

按照我的逻辑,应该是 [WHERE o.rn = 1]

AT 解释得更清楚,让我们将所有子 table(以 SELECT year(OrderDate).... 开头的)存储为一个名为 z 的变量。 z 现在是您从括号内的 select table 语句创建的 table。

查询现在看起来像 SELECT * FROM (z) oo WHERE oo.rn =1 在括号之后,您有一个语句 'oo',它将 table 存储在 内部 括号内作为 oo.

然后您 select 来自此 oo 的值 table 通过它的 rn

在 SQL 中,查询的结果本身可以被认为是 table。

您可以“引用”查询的结果并将其视为这样,这样做时它被称为 derived table - 即,它是a table 派生 来自另一个查询的输出。

在您的示例中,SELECT year(OrderDate)... 是一个查询,select * 正在使用其结果。语法规则是派生的 table 必须给出一个 alias 来引用它,在这种情况下的别名是 oo,可以用来引用属于内部查询结果的任何列。

因为在顶层没有引用其他“tables”,查询本质上是在说 select * from table,不需要使用别名并且不使用 oo.查询解析器知道它必须引用唯一存在的派生 table,因此 where rn=1 将像从实际 table.

中选择 * 一样工作