2017-08-12 15 views
0

私は左を作るしようとしているところでselect文に参加し、このような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句を指定すると、あなたが間のすべてのレコードをしたいと言っています2つの特定の日付。 *しかし、*、あなたが入力したコードは、 "私は様々な日付の次のレコードセットの間にすべての日付がほしい"と解釈されます。それを処理することはできません。あなたはそれが表1によって返された最も早い日付と最新の日付との間にあることを意図していますか? – SandPiper

答えて

1

一つの方法は、2つの相関サブクエリを使用しています:

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列。 @ MuhammadDyasYaskur。 –

+2

。 。 「ただ」という言葉は私の答えのどこにも現れません。より一般的な解決策が必要な場合は、*別の質問をして、サンプルデータと希望の結果を含めることをお勧めします。この質問はかなり具体的なものであり、データは記述されていません(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