2013-02-07 36 views
0

我總是與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

你能給出想要的結果 – polin

+0

@polin的輸出結果本身並不重要。當我看到這樣的問題時,我完全不知道該去哪裏。我想知道爲什麼需要兩個選擇。 – ericyoung

+0

@erciyoung:原因是評估順序(SELECT查詢):'FROM - > WHERE - > SELECT'。您不能在尚未評估過的地方使用。 –

回答

0

max()是SQl中的GROUP函數,即在第二個查詢中沒有得到正確答案的原因。

首先查詢它首先檢索最大值,然後比較表中的最大值。

3

由於在SELECT之前WHERE子句是(邏輯)處理

的處理順序是:

  1. FROM
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 選擇
  9. DISTINCT
  10. ORDER BY
  11. TOP

(從here被盜)

正如你所看到的,SELECT實際發生得比較晚上在這個過程中,在任何可能的過濾和groupi之後ng活動已經發生。因此,如果要使用SELECT子句中的表達式的結果,最好是作爲子查詢(或(更早的)CTE)的一部分的SELECT

+0

+1,但TOP = 11;) –

+0

@AlexanderFedorenko - 責怪我偷走的博客文章。他們在'10'後沒有'.',這導致該條目被添加到'9.'的末尾,因此使用列表編號來做這件事情很有趣。 –

+0

下次您可以從[此答案](http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685)中竊取。我忽略了非標準的「外部應用」和「頂部」。 –

相關問題