2015-12-05 35 views
1

我對面的方式來而不ROW_NUMBER函數來獲取行號:計算沒有ROW_NUMBER函數的行號。它是如何工作的?

SELECT name, sal, (SELECT COUNT(*) FROM EMPLOYEE i WHERE o.name >= i.name) row_num 
FROM EMPLOYEE o 
order by row_num 

有一些解釋HERE 但我仍然不明確這一點。

+2

嚴格地說,這是計算一個函數有關'rank()'而不是'row_number()',除非你可以保證'name'是唯一的。 –

回答

3

這是實施例的correlated subquery

SELECT name, sal, (SELECT COUNT(*) FROM EMPLOYEE i WHERE o.name >= i.name) row_num 
FROM EMPLOYEE o 
order by row_num 

許多查詢可以通過執行一次子查詢和 所得到的值或值代入進行評價WHERE的 外部查詢子句。在包含相關子查詢(也稱爲 ,稱爲重複子查詢)的查詢中,子查詢取決於外部 查詢的值。這意味着子查詢會重複執行 ,對於可能由外部 查詢選擇的每一行都會執行一次。

讓我們假設你有:

╔═══════╦═════╗ 
║ NAME ║ SAL ║ 
╠═══════╬═════╣ 
║ Anno ║ 80 ║ 
║ Bhuti ║ 60 ║ 
║ Darl ║ 80 ║ 
║ Hash ║ 100 ║ 
╚═══════╩═════╝ 

對於外部查詢Anno,子查詢將返回唯一

╔══════╦═════╗ 
║ NAME ║ SAL ║ 
╠══════╬═════╣ 
║ Anno ║ 80 ║ 
╚══════╩═════╝ 

對於Bhuti則回覆:

╔═══════╦═════╗ 
║ NAME ║ SAL ║ 
╠═══════╬═════╣ 
║ Anno ║ 80 ║ 
║ Bhuti ║ 60 ║ 
╚═══════╩═════╝ 

對於Darl它將返回:

╔═══════╦═════╗ 
║ NAME ║ SAL ║ 
╠═══════╬═════╣ 
║ Anno ║ 80 ║ 
║ Bhuti ║ 60 ║ 
║ Darl ║ 80 ║ 
╚═══════╩═════╝ 

依此類推。 COUNT函數會得到你的行數。您還應該發現外部查詢和子查詢使用同一個表EMPLOYEE。用別名oi來區分它們。

您可以考慮將correlated subqueries作爲基於集合的環境中的循環方式。

編輯:

這是ROW_NUMBER功能相當於差。 Example from question

生成行號 - 這是 每一行的數字正在運行的序列使用普通的SQL是不容易的。實際上,下面展示的方法 也不是非常通用的。 此方法僅適用於 表中至少有一個唯一列。如果沒有唯一的唯一列,但是 列是唯一的,那麼此方法將會工作 。無論如何,這裏是查詢:

+0

hmm ..但是如果NAME列不是唯一的,這不是一個好習慣,對嗎? –

+0

@kenlacoste是的,它只適用於獨特的色譜柱/色譜柱組合 – lad2025

相關問題