2013-12-11 44 views
1

我有地址表中的要求我有很多人的地址存儲但是某個人的地址可以改變。但地址表只是插入的。每次某個人的地址改變我們插入一個新行並改變該行的地址,我們在表中有一個common_id列,告訴哪個人這個地址被改變了。因此,對於特定行中的每個改變,新行添加了與原始初始行相同的common_id。我寫了查詢爲獲取最新地址(由TIME_CREATED找到),其狀態爲N和L型的所有people.But它失敗ORACLE SQL問題

select * 
from address wi 
where type = 'L' 
    and status = 'N' 
    and time_created = (
    select time_created 
    from (
     select * 
     from address w1 
     where wi.common_id = w1.common_id 
     order by time_created desc 
    ) t 
    where rownum = 1 
    ) 

上面的查詢失敗,但是當我寫下面的查詢是PAS唱歌並給出預期結果

select * 
from address wi 
where type = 'L' 
    and status = 'N' 
    and time_created = (
    select max(time_created) 
    from address t 
    where t.common_id = wi.common_id 
    ) 

上述查詢正在通過並給出預期結果。

我很驚訝爲什麼以前的查詢失敗給ora-00904無效標識符wi.common_id.Kindly幫助理解。

回答

1

你的問題是,你正在嘗試使關聯兩個級別關閉,你只能在一個層次上做到這一點。這就是爲什麼你的第二個查詢有效,而第一個不會。由於它不再識別wi.common_id,因爲您正在執行兩個嵌套子查詢來查找最新日期。

​​
+0

謝謝菲利普。 bur 2級下降sql識別。我只是檢查員工數據庫,以瞭解所有在所有項目中工作的員工。它工作正常 –

+0

select * from employee e where not exists(select * from project p where where exists(select * from work_on wo其中e.name = wo.name和wo.prj_name = p.prj_name)); 2檢測到員工e被檢測到 –

+0

這不是一回事。這些是子查詢。我在說:select * from(select * from(select * from table1))。第二個選擇可以連接到第一個和第三個,但第三個不能與第一個連接。就像在你使用rownum的查詢中一樣,你在這個查詢中有兩個級別,而在查詢中你只有一個。 –