2017-08-12 104 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