[英]How can I use an alias inside a sub-query?
我想要實現的是從以下形式的表中獲取具有最大值的行:
A | B | Ratio
0 | 1 | 1.0
1 | 2 | 1.0
2 | 3 | 1.0
3 | 4 | 0.33
4 | 5 | 0.25
我試圖只顯示包含最大值的行(在本例中為1.0)。 可能是我沒有這樣做。 我有一個表格的查詢:
SELECT A,B,C
FROM (---Long Sub Query--- Aliased as Full_Table)
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table);
但是,無法從第二個子查詢引用Full_Table。 有些行具有相同的最大值,這是我使用此查詢的原因。 有沒有更好的結構來實現這一目標? 在最壞的情況下,我必須用整個長查詢替換第二個Full_Table,但我希望有更好的方法來做到這一點。
您可以使用公用表表達式:
WITH Full_Table AS (---Long Sub Query---)
SELECT A,B,C
FROM Full_Table
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table);
使用:
SELECT full_table.a,
full_table.b,
full_table.c
FROM (SELECT ...,
RANK() OVER (ORDER BY ratio DESC) AS rank
FROM Sub Query---) full_table
WHERE full_table.rank = 1
目前尚不清楚是否可以返回多條記錄,因此我使用RANK()
而不是ROW_NUMBER()
因為ROW_NUMBER
只會返回一條記錄。
你可以把它合並到一個WITH
子句中,但它仍然是派生表/內聯視圖與你的兩次傳遞的一次傳遞......
Oracle 9i +支持WITH
語法,稱之為“子查詢因子”。 來自SQL Server 2005+的那些人將WITH
語法知道為公用表表達式(CTE)。 與SQL Server的實現不同,Oracle 9i-11g上的WITH
語法不是遞歸的 - Oracle僅在11g R2中添加了遞歸WITH支持(現在它是ANSI),部分原因是Oracle支持使用CONNECT BY
語法的遞歸功能(自Oracle以來支持) V2)。 WITH
語法是派生表/內聯視圖的語法糖 - 查詢計划不會為每個實例重用。
WITH full_table AS (
SELECT...)
SELECT x.a, x.b, x.c
FROM full_table x
JOIN (SELECT MAX(t.ratio) AS max_ratio
FROM full_table t) y ON y.max_ratio = x.ratio
......與使用相同:
SELECT x.a, x.b, x.c
FROM (SELECT ...) x
JOIN (SELECT MAX(t.ratio) AS max_ratio
FROM (SELECT ...) t) y ON y.max_ratio = x.ratio
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.