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.
中选择 * 一样工作
以这段代码为例,选取每年订单量最高的:
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.