2011-05-26 159 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