我有这张桌子
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
答案 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)
您只是从主表中选择行。我认为您应该使用in
或exists
代替:
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_A
和Table_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
所有列。