2010-09-05 105 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 
相关问题