簡體   English   中英

如何在子查詢中使用別名?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM