2011-05-26 157 views
3

希望标题使用值使某种意义 - 我基本上喜欢做嵌套查询的基础上,在原来选择的值,像这样:SQL - 在嵌套查询

SELECT MAX(iteration) AS maxiteration, 
     (SELECT column 
     FROM table 
     WHERE id = 223652 
       AND iteration = maxiteration) 
FROM table 
WHERE id = 223652; 

我得到一个ORA-00904无效标识符错误。

对于如何返回此值,我们将非常感激,谢谢!

+0

你能后的完整的错误信息? – csl 2011-05-26 13:45:27

+1

非常惊人的回复,谢谢你们! – Nick 2011-05-26 15:16:08

回答

3

看起来这应该有一个where子句被改写:

select iteration, 
     col 
from tbl 
where id = 223652 
and iteration = (select max(iteration) from tbl where id = 223652); 
+0

+1:我的首选版本,但是我会将'223652'的第二个实例更改为引用来自外部查询的id。 (但是,还需要给'tbl'的一个实例赋予别名。) – MatBailie 2011-05-26 14:08:17

2

通过将子查询置于其自己的INNER JOIN中,可以将所有问题一并回避。

SELECT t.iteration 
     , t.column 
FROM table t 
     INNER JOIN (
     SELECT id, MAX(iteration) AS iteration 
     FROM table 
     WHERE id = 223652 
     ) tm ON tm.id = t.id AND tm.iteration = t.iteration 
+0

但_why_这个工作,他的例子不是? – csl 2011-05-26 13:48:27

+1

由于很少有RD​​BMS允许将聚合函数的别名用作相关子查询中的参考。如果允许,则会有级联的依赖关系(相关的子查询结果可以用于另一个相关的子查询中)。这甚至可能导致循环引用和其他复杂性。所以,一般来说,这只是不被允许的。 (Daniel Hilgarth的回答是最接近OP的答案。) – MatBailie 2011-05-26 14:11:37

1

做这样的:

with maxiteration as 
(
    SELECT MAX(iteration) AS maxiteration 
    FROM table 
    WHERE id = 223652 
) 
select 
    column, 
    iteration 
from 
    table 
where 
    id = 223652 
    AND iteration = maxiteration 
; 
0

我会在一个稍微不同的方式解决这个问题。你基本上在寻找没有其他迭代大于它的那一行。至少有3种方式我能想到的要做到这一点:

SELECT 
    T1.iteration AS maxiteration, 
    T1.column 
FROM 
    Table T1 
WHERE 
    T1.id = 223652 AND 
    NOT EXISTS 
    (
     SELECT * 
     FROM Table T2 
     WHERE 
      T2.id = 223652 AND 
      T2.iteration > T1.iteration 
    ) 

或者......

SELECT 
    T1.iteration AS maxiteration, 
    T1.column 
FROM 
    Table T1 
LEFT OUTER JOIN Table T2 ON 
    T2.id = T1.id AND 
    T2.iteration > T1.iteration 
WHERE 
    T1.id = 223652 AND 
    T2.id IS NULL 

或者......

SELECT 
    T1.iteration AS maxiteration, 
    T1.column 
FROM 
    Table T1 
INNER JOIN (SELECT id, MAX(iteration) AS maxiteration FROM Table T2 GROUP BY id) SQ ON 
    SQ.id = T1.id AND 
    SQ.maxiteration = T1.iteration 
WHERE 
    T1.id = 223652 

编辑:我没有”在第一次读取问题时不会看到ORA错误,并且它没有被标记为特定于Oracle。我认为Oracle中的别名的语法和用法可能存在一些差异,因此您可能需要调整一些上述查询。

Oracle错误告诉你它不知道什么是最大化,因为列别名在子查询中还不可用。您需要通过表别名和列名称来引用它,而不是我相信的列别名。确保在Oracle语法

1

不是100%,不过,是不是一样的东西:

select iteration, column from table where id = 223652 order by iteration desc limit 1 
0

你这样做

select maxiteration,column from table a join (select max(iteration) as maxiteration from table where id=1) b using (id) where b.maxiteration=a.iteration; 

这当然可以为一个maxiteration除非返回多行的表对它有一个约束。

2

由于您使用的是Oracle,我建议使用分析功能是:

SELECT * FROM (
    SELECT col, 
     iteration, 
     row_number() over (partition by id order by iteration desc) rn 
    FROM tab 
    WHERE id = 223652 
) WHERE rn = 1