2010-07-26 96 views
4

對於一對光標的第一FETCH後在那裏立即所需的行的在結果的總數,(經過一些嘗試和錯誤)我想出了下面的查詢PARTITION BY 1是什麼意思?

SELECT 
col_a, 
col_b, 
col_c, 
COUNT(*) OVER(PARTITION BY 1) AS rows_in_result 
FROM 
myTable JOIN theirTable ON 
myTable.col_a = theirTable.col_z 
GROUP BY 
col_a, col_b, col_c 
ORDER BY 
col_b 

現在,當查詢的輸出是X行,rows_in_result準確地反映了這一點。

  • PARTITION BY 1是什麼意思?
    • 認爲它可能告訴數據庫結果劃分爲1行的每件

回答

9

這是一個不尋常的使用分區BY。它所做的是將所有內容放入同一個分區,以便如果查詢完全返回123行,則每行的rows_in_result值將爲123(如其別名所暗示的那樣)。

因此等同於更簡潔:

COUNT(*) OVER() 
1

數據庫是相當自由的限制添加到OVER()條款。有時,根據聚合函數,PARTITION BY [...]和/或ORDER BY [...]是強制性子句。 PARTITION BY 1可能只是用於語法完整性的虛擬子句。下面的兩個通常是等價的:

[aggregate function] OVER() 
[aggregate function] OVER (PARTITION BY 1) 

注意,雖然,Sybase SQL Anywhere的和CUBRID解釋此1爲列索引引用,類似什麼是可能的ORDER BY [...]子句。這看起來有點令人驚訝,因爲它會將查詢順序添加到查詢的預測中。在你的情況,這將然後意味着下面的是等價的

COUNT(*) OVER (PARTITION BY 1) 
COUNT(*) OVER (PARTITION BY col_a) 

這奇怪的偏差與其他數據庫解釋允許引用更復雜的分組表達式。

+0

@JeffreyKemp:我看到您對已刪除答案的評論。事實上,不幸的是,令我驚訝的是,有*解釋這個簡單表達的不同方式。 – 2012-12-03 11:48:28

+0

@OMGPonies:您的原始(現已刪除)答案對於Oracle是錯誤的,但對於其他數據庫是正確的... – 2012-12-03 11:49:02