SQL - 在嵌套查询
希望标题使用值使某种意义 - 我基本上喜欢做嵌套查询的基础上,在原来选择的值,像这样:SQL - 在嵌套查询
SELECT MAX(iteration) AS maxiteration,
(SELECT column
FROM table
WHERE id = 223652
AND iteration = maxiteration)
FROM table
WHERE id = 223652;
我得到一个ORA-00904无效标识符错误。
对于如何返回此值,我们将非常感激,谢谢!
看起来这应该有一个where子句被改写:
select iteration,
col
from tbl
where id = 223652
and iteration = (select max(iteration) from tbl where id = 223652);
+1:我的首选版本,但是我会将'223652'的第二个实例更改为引用来自外部查询的id。 (但是,还需要给'tbl'的一个实例赋予别名。) – MatBailie 2011-05-26 14:08:17
通过将子查询置于其自己的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
做这样的:
with maxiteration as
(
SELECT MAX(iteration) AS maxiteration
FROM table
WHERE id = 223652
)
select
column,
iteration
from
table
where
id = 223652
AND iteration = maxiteration
;
我会在一个稍微不同的方式解决这个问题。你基本上在寻找没有其他迭代大于它的那一行。至少有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语法
不是100%,不过,是不是一样的东西:
select iteration, column from table where id = 223652 order by iteration desc limit 1
你这样做
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除非返回多行的表对它有一个约束。
由于您使用的是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
你能后的完整的错误信息? – csl 2011-05-26 13:45:27
非常惊人的回复,谢谢你们! – Nick 2011-05-26 15:16:08