加入三个表没有联合

时间:2014-11-20 20:13:32

标签: sql oracle join

我有这张桌子

Main_Table

Date    Center      Response    Indicator       IDSurvey
--------------------------------------------------------
11-14   C1          10          LOP             432
11-15   C2          20          IUY             235
11-16   C1          35          LOP             125
11-17   C3          65          OIU             548
11-18   C3          45          OIU             693
11-19   C2          68          RES             236

我需要将此表与两个互斥的表

连接起来
Table_A
----------------------------------
Center      Group       Indicator
C1          GroupA1     LOP
C2          GroupA2     IUY
C3          GroupA3     OIU

Table_B
--------------------------------
Center      Group       IDSurvey
C1          GroupB1     236

与联盟的联接将带来我的主表的六个记录。没有工会,有没有办法做到这一点?

这是查询

select da.Date, da.Center, da.Response, da.Indicator, da.IDSurvey 
from Main_Table da
join Table_A ca 
on da.Indicator = ca.Indicator and ca.Center=da.Center
union
select da.Date, da.Center, da.Response, da.Indicator, da.IDSurvey 
from Main_Table da
join Table_B ca 
on ca.Center=da.Center and ca.IDSurvey=da.IDSurvey

3 个答案:

答案 0 :(得分:4)

为什么不跟JOIN一起TableB以及TableA一样

select da.Date, da.Center, da.Response, da.Indicator, da.IDSurvey 
from Main_Table da
left join Table_A ca 
on da.Indicator = ca.Indicator and ca.Center = da.Center
left join Table_B ba 
on ba.Center = da.Center and ba.IDSurvey = da.IDSurvey;

答案 1 :(得分:0)

您只是从主表中选择行。我认为您应该使用inexists代替:

select da.Date, da.Center, da.Response, da.Indicator, da.IDSurvey 
from Main_Table da
where exists (select 1 from Table_A ca where da.Indicator = ca.Indicator and ca.Center = da.Center) or
      exists (select 1 from Table_B ca where ca.Center = da.Center and ca.IDSurvey = da.IDSurvey)

您的union也删除了重复项。使用exists您既不需要union也不需要重复删除。而且,这可以充分利用Table_ATable_B上的索引。

答案 2 :(得分:0)

要获得与union的2个连接完全相同的结果,您需要从主表中排除记录而不使用以下WHERE子句的任何细节:

select da.Date, da.Center, da.Response, da.Indicator, da.IDSurvey 
from Main_Table da
left join Table_A ca 
on da.Indicator = ca.Indicator and ca.Center = da.Center
left join Table_B ba 
on ba.Center = da.Center and ba.IDSurvey = da.IDSurvey
WHERE (ca.rowid is not null or ba.rowid is not null);

顺便说一句,union也隐含地group by。因此,如果您确实要删除重复项,则还需要添加group by所有列。