0

我总是与 sql 子查询作斗争。例如这个问题的答案:

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. 在什么样的情况下我应该考虑使用这种子查询(除了正常的in、exist等)?

4

2 回答 2

3

因为该WHERE子句(逻辑上) SELECT.

处理顺序为:

  1. 在哪里
  2. 通过...分组
  3. 立方体 | 卷起
  4. 拥有
  5. 选择
  6. 清楚的
  7. 订购方式
  8. 最佳

(从这里偷来的)

如您所见,SELECT实际上发生在流程的后期,在任何可能的过滤和分组活动发生之后。因此,如果您想在SELECT子句中使用表达式的结果,最好是SELECT作为子查询(或(早期)CTE)一部分的 a。

于 2013-02-07T07:38:06.550 回答
0

max() 是 SQl 中的一个 GROUP 函数,这就是在第二个查询中没有得到正确答案的原因。

在第一个查询中,它首先检索最大值,然后比较表中的最大值。

于 2013-02-07T07:32:29.373 回答