2017-08-12 130 views
0

我試圖做出選擇左側的語句加入一個select語句是這樣的:SQL左連接與where子句

select * 
from (select * from foo where rownum <= 10) tab1 
left join (select sum(total) total,sum(worker) worker from bars where work_date between tab1.start_date and tab1.end_date) tab2 
on tab1.foo_id=tab2.id 

,我得到以下錯誤:

oci_execute(): ORA-00904: "tab1"."end_date": invalid identifier

任何幫助將不勝感激,謝謝!做你想做什麼

+0

當您指定where子句,你說你想之間的所有記錄兩個具體日期。 *然而,*鍵入的代碼被解釋爲「我希望在各種日期的以下記錄集之間的所有日期」。它無法處理。你是否打算在表1返回的最早和最晚的日期之間? – SandPiper

回答

1

一種方法是使用兩個相關子查詢:

select foo.* 
    (select sum(b.total) as total, sum(worker) as worker 
     from bars 
     where b.work_date between foo.start_date and foo.end_date and 
      foo.foo_id = b.id 
    ) as total, 
    (select sum(b.worker) as worker 
     from bars b 
     where b.work_date between foo.start_date and foo.end_date and 
      foo.foo_id = b.id 
    ) as worker 
from foo 
where rownum <= 10; 
+0

真的只有一種方式嗎?實際上,我發現上面提到的方式,我在這裏問,因爲我認爲如果我使用聯接更有效,因爲更少的選擇查詢。實際上我必須選擇5欄。 –

+2

@MuhammadDyasYaskur。 。 。單詞「only」不會出現在我的答案中的任何地方。如果你想要一個更一般的解決方案,我建議你問*另一個問題,幷包括樣本數據和期望的結果。這個問題很具體,數據也沒有描述(不是Oracle的版本),所以我會堅持這個解決方案是最有利的。 –

1

這也應該工作:

select 
    tab1.foo_id 
    ,tab1.start_date 
    ,tab1.end_date 
    ,sum(tab2.total) as total 
    ,sum(tab2.worker) as worker 
from foo tab1 
left join bars tab2 
    on tab2.work_date between tab1.start_date and tab1.end_date 
    and tab1.foo_id = tab2.id 
where tab1.rownum <= 10 
group by 
    tab1.foo_id 
    ,tab1.start_date 
    ,tab1.end_date