2012-11-24 29 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表:) :)我认为它变得非常难以阅读 –