我总是在使用sql子查询。例如this question的答案:
select userid,
my_date,
...
from
(
select userid,
my_Date,
...
max(my_date) over (partition by userid) max_my_date
from users
)
my_date = max_my_date
为什么它只是:
select userid,
my_Date,
...
max(my_date) over (partition by userid) max_my_date
from users
where
my_date = max_my_date
我知道它不正确,但毕竟第一个选择只从第二个选择的结果中选择一些,加上my_date = max_my_date
。在什么样的情况下我应该考虑使用这种子查询(除了普通的,存在的等)?
答案 0 :(得分:3)
因为WHERE
子句在 SELECT
之前(逻辑上)处理了。
处理顺序为:
- FROM
- ON
- OUTER
- WHERE
- GROUP BY
- CUBE | ROLLUP
- HAVING
- 选择
- DISTINCT
- ORDER BY
- TOP
醇>
(从here被盗)
正如您所看到的,在发生任何可能的过滤和分组活动之后,SELECT
实际上在过程中发生得很晚。因此,如果要在SELECT
子句中使用表达式的结果,最好是SELECT
,它是子查询(或(早期)CTE)的一部分。
答案 1 :(得分:0)
max()是SQl中的GROUP函数,它解释了在第二个查询中没有得到正确答案的原因。
在第一个查询中,它首先检索最大值,然后比较表中的最大值。