2010-03-17 45 views
2

我有這個疑問:甲骨文 - 相關子查詢的問題

select acc_num 
from (select distinct ac_outer.acc_num, ac_outer.owner 
     from ac_tab ac_outer 
     where (ac_outer.owner = '1234567') 
      and ac_outer.owner = (select sq.owner 
             from (select a1.owner 
              from ac_tab a1 
              where a1.acc_num = ac_outer.acc_num /*This is the line that gives me problems.*/ 
              order by a1.a_date desc, a1.b_date desc, a1.c_date desc) sq 
             where rownum = 1) 
     order by dbms_random.value()) subq 
order by acc_num; 

的想法是從ac_tab得到所有acc_num秒(而不是主鍵),即有1234567一個owner

由於ac_tabacc_num可能隨着時間的推移發生了變化owner S,我嘗試使用內相關子查詢,以確保返回的acc_num只有當它的最近owner12345678。當然,它不起作用(或我不會在這裏張貼;))

Oracle給了我一個錯誤:ORA-000904 ac_outer.acc_num is an invalid identifier

我認爲ac_outer應該是相關的子查詢可見,但由於某種原因,它不是。有沒有辦法來解決這個問題,還是我不得不求助於PL/SQL來解決這個問題?

(甲骨文verison爲10g)

回答

6

我不確定Peter爲什麼使用Min(所有者)分析函數而不是first_value(所有者)。我相信後者給你什麼,而最小(所有者)給你的「最小」所有者。其他的一切在查詢我同意:

Select Distinct acc_num 
From (
     Select 
      acc_num, 
      owner, 
      first_value(owner) Over (Partition By acc_num 
        Order By a_date Desc, b_date Desc, c_date Desc 
       ) recent_owner 
     From ac_tab 
    ) 
Where owner = '1234567' 
     And owner = recent_owner 
Order By acc_num; 
+0

+1:你說得對,謝謝你的糾正。不知道我在想什麼... –

+0

我需要對結果做更多​​的分析,但是這似乎給了我想要的東西。我真的需要更多地瞭解分析功能! – FrustratedWithFormsDesigner

2

我想你通過嵌套兩個深與子查詢的「AC_OUTER」別名失去範圍。我顯然不知道自己的模式,但是依賴max(date)來完成任何排序操作和rownum。你爲什麼不嘗試這樣的事:

select ac_outer.acc_num, ac_outer.owner, max(a1.adate), max(a1.b_date), max(a1.c_date) 
from ac_tab "AC_OUTER" 
where ac_outer.owner = '1234567' 
group by ac_outer.owner, ac_outer.acc_num; 
+1

你是對的,超出範圍,因爲超過1級。這就是代碼不能按原樣運行的原因。 –

+0

你的意思是我應該用這個替代最內層的查詢?不知道如何將其整合到查詢的其餘部分(並自行運行並不能給出正確的結果)。儘管我認爲你對於範圍設定問題絕對正確,但我期望所有的外部查詢對於最內層的查詢都是可見的,但是它看起來像嵌套查詢只對直接嵌套在其中的查詢可見。 – FrustratedWithFormsDesigner

1

你應該使用Oracle的分析功能通過

4

做到這一點使用分區我沒有看到你所需要的dbms_random.value()的,但下面的查詢使用analytic functions應該給您預期的結果:

Select Distinct acc_num 
From (
    Select 
    acc_num, 
    owner, 
    First_Value(owner) Over (Partition By acc_num 
           Order By a_date Desc, b_date Desc, c_date Desc 
          ) recent_owner 
    From ac_tab 
) 
Where owner = '1234567' 
    And owner = recent_owner 
Order By acc_num; 

子查詢讓你的老闆和每acc_num最近的主人,然後可以在外部查詢進行比較。

+0

忽略'dbms_random.value()',我正在測試其他東西。 ;) – FrustratedWithFormsDesigner

+0

這就是我做的:)所以它適合你嗎? –

0

您可以取代你的有序的子查詢與一個NOT EXISTS,來檢查,如果有一些其他業主在稍後的日期。