2012-11-24 27 views
1

連接列說我有如下表:沒有中央重點源表

+---------------------+ 
| Item_Color_Meta | 
+---------------------+ 
| ID  | value | 
+---------------------+ 
| 1  | 'red' | 
| 4  | 'blue' | 
+---------------------+ 

+---------------------+ 
| Item_Height_Meta | 
+---------------------+ 
| ID  | value | 
+---------------------+ 
| 1  | '2inch' | 
| 2  | '7inch' | 
| 6  | '12inch'| 
+---------------------+ 

我有很多這些表持有和ID和值。我想創建一個結果集返回所有標識與每個表列線,所以上述結果的情況下,看起來就像這樣:

ID    Color_Meta    Height_Meta 
1     'red'      '2inch' 
2     NULL      '7inch' 
4     'blue'     NULL 
6     NULL      '12inch' 

我的問題是與語句組合什麼是最有效的方法呢?

回答

1

你需要full outer join

select 
    isnull(ICM.ID, IHM.ID) as ID, ICM.Color_Meta, IHM.Height_Meta 
from Item_Color_Meta as ICM 
    full outer join Item_Height_Meta as IHM on IHM.ID = ICM.ID 

如果你有2個以上的表,你可以考慮水木清華這樣

更新是的,我已經忘了MySQL不支持full outer join,所以這一個將無論如何工作:)

select 
    A.ID, T1.Column1, T2.Column2, T3.Column3 
from 
(
    select TT1.ID from Table1 as TT1 union 
    select TT2.ID from Table2 as TT2 union 
    select TT3.ID from Table3 as TT3 
) as A 
    left outer join Table1 as T1 on T1.ID = A.ID 
    left outer join Table2 as T2 on T2.ID = A.ID 
    left outer join Table3 as T3 on T3.ID = A.ID 

這個語法是ve RY易於修改,你可以添加額外的表

檢查SQL FIDDLE EXAMPLE

+0

MySQL不支持全外連接 –

+0

嗯,如果沒有把握MySQL有全外連接 – Andomar

+0

是,我已經改變了答案。 –

1
select id 
,  min(Color_Meta) 
,  min(Height_Meta) 
from (
     select id 
     ,  value as Color_Meta 
     ,  null as Height_Meta 
     from Item_Color_Meta 
     union all 
     select id 
     ,  null 
     ,  value 
     from Item_Height_Meta 
     ) as SubQueryAlias 
group by 
     id 

Live example at SQL Fiddle.

+0

假設你有20個表格。您的查詢將非常龐大。看看我的回答 –

0
select c.id, c.val Color_Meta, h.val Height_Meta 
    from Item_Color_Meta c 
    left outer join Item_Height_Meta h on c.id = h.id 

    UNION 

    select h.id, c.val Color_Meta, h.val Height_Meta 
    from Item_Height_Meta h 
    left outer join Item_Color_Meta c on c.id = h.id 
+0

downvoter的任何意見? – Isaac

+0

不是我的downvote,但你會得到兩行ID爲1使用此解決方案 – Andomar

+0

嘗試寫這個10表:) :)我認爲它變得非常難以閱讀 –