为什么结果应该来自子查询?

时间:2013-02-07 07:26:55

标签: sql subquery

我总是在使用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。在什么样的情况下我应该考虑使用这种子查询(除了普通的,存在的等)?

2 个答案:

答案 0 :(得分:3)

因为WHERE子句在 SELECT之前(逻辑上)处理了

处理顺序为:

  
      
  1. FROM
  2.   
  3. ON
  4.   
  5. OUTER
  6.   
  7. WHERE
  8.   
  9. GROUP BY
  10.   
  11. CUBE | ROLLUP
  12.   
  13. HAVING
  14.   
  15. 选择
  16.   
  17. DISTINCT
  18.   
  19. ORDER BY
  20.   
  21. TOP
  22.   

(从here被盗)

正如您所看到的,在发生任何可能的过滤和分组活动之后,SELECT实际上在过程中发生得很晚。因此,如果要在SELECT子句中使用表达式的结果,最好是SELECT,它是子查询(或(早期)CTE)的一部分。

答案 1 :(得分:0)

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

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