我對面的方式來而不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 但我仍然不明確這一點。
我對面的方式來而不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 但我仍然不明確這一點。
這是實施例的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
。用別名o
和i
來區分它們。
您可以考慮將correlated subqueries
作爲基於集合的環境中的循環方式。
編輯:
這是ROW_NUMBER
功能相當於差。 Example from question
:
生成行號 - 這是 每一行的數字正在運行的序列使用普通的SQL是不容易的。實際上,下面展示的方法 也不是非常通用的。 此方法僅適用於 表中至少有一個唯一列。如果沒有唯一的唯一列,但是 列是唯一的,那麼此方法將會工作 。無論如何,這裏是查詢:
hmm ..但是如果NAME列不是唯一的,這不是一個好習慣,對嗎? –
@kenlacoste是的,它只適用於獨特的色譜柱/色譜柱組合 – lad2025
嚴格地說,這是計算一個函數有關'rank()'而不是'row_number()',除非你可以保證'name'是唯一的。 –