2014-11-20 78 views
0

我有這個表加入三個表沒有工會

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 

A和工會的加入將帶來六個記錄我的主表。有沒有辦法做到這一點沒有工會?

這是查詢

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

爲什麼你不想使用'union'? – Supersnake 2014-11-20 20:16:38

+0

@Supersnake有許多原因,其中兩個:只是好奇心和目標,以獲得最佳解決方案 – 2014-11-20 20:20:03

+0

最好的解決方案可能是一個'聯合'查詢。也許使用'union all'。 – 2014-11-20 22:10:46

回答

4

爲什麼不只是做一個JOINTableB以及與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; 
+0

這不適合我,我在甲骨文,這不給我記錄;我認爲原因是因爲連接是先用table_a創建的,然後該結果試圖與table_b – 2014-11-20 20:22:51

+0

@NatyBizz結合,在這種情況下,請考慮使用'LEFT JOIN'來代替。請參閱編輯答案。 – Rahul 2014-11-20 20:24:42

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上的索引。

0

爲了得到精確的結果相同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所有列。