如何在子查询中使用别名?

时间:2010-09-05 17:20:26

标签: sql oracle

我想要实现的是从以下形式的表中获取具有最大值的行:

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,但我希望有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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子句中,但它仍然是派生表/内联视图与你的两次传递的一次传递......

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