2010-09-05 24 views
3

我試圖實現是讓行從以下形式的表具有最大值:如何在子查詢中使用別名?

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,但我希望有更好的方法來完成此操作。

回答

5

您可以使用公用表表達式:

WITH Full_Table AS (---Long Sub Query---) 
SELECT A,B,C 
FROM Full_Table 
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table); 
+0

美麗..!非常感謝你 :) – Legend 2010-09-05 17:31:56

2

用途:

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條款,但它仍然是一個傳過來的派生表/內嵌視圖VS你兩遍......

的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 
相關問題