2011-12-31 72 views
2

反正是有由柱CMySQL表合并

表1到这两个表合并:

A B C 
a b 1 
c d 2 
e f 3 

表2:

C D E 
1 G H 
4 I J 
5 K L 

组合:

A B C D E 
a b 1 G H 
c d 2 0 0 
e f 3 0 0 
0 0 4 I J 
0 0 5 K L 


我不认为连接函数的工作原理,因为它不会留下列C的所有5个结果?

+0

删除,忽略了左表也是空的一些值;) – Aufziehvogel 2011-12-31 17:27:52

+0

什么左加入+右加入+联合。也许像这样(SELECT ... LEFT JOIN ...)UNION(SELECT ... RIGHT加入t1.c = t2.c和t1.c IS NULL)。在第一部分会给你所有的都带有一个NULL,而在第二部分都带有一个NULL。 – Aufziehvogel 2011-12-31 17:33:33

+0

与连接一起选择不同的C? – Dimme 2011-12-31 17:34:45

回答

0

这一个曾在我的测试:

(SELECT t.a, t.b, t.c, COALESCE(t2.d, 0), COALESCE(t2.e, 0) 
    FROM t 
    LEFT JOIN t2 ON t.c = t2.c) 
UNION 
(SELECT 0, 0, t2.c, t2.d, t2.e 
    FROM t2 
    LEFT JOIN t ON t2.c = t.c 
    WHERE t.c IS NULL) 

测试数据:

Table 1 
a b c 
1 0 1 
2 2 2 

Table 2 
c d e 
2 0 2 
3 0 3 

结果

a b c d e 
1 0 1 0 0 
2 0 2 0 2 
0 0 0 3 3 
+0

尝试通过使用** COALESCE ** – 2011-12-31 17:42:25

+0

完成将NULL值转换为零完成,感谢您的改进:) – Aufziehvogel 2011-12-31 17:49:21

-1

您想使用UNION而不是JOIN。

请参阅W3schools一个很好的解释。

0

这是做的最好的例子FULL OUTER JOIN但MySQL的(据我所知)不能做到这一点:

的样本数据:

create table tab1 (A char(1), B char(1), C int); 
insert into tab1 
select 'a', 'b', 1 union all 
select 'c', 'd', 2 union all 
select 'e', 'f', 3; 

create table tab2 (C int, D char(1), E char(1)); 
insert into tab2 
select 1, 'G', 'H' union 
select 4, 'I', 'J' union 
select 5, 'K', 'L'; 

Full outer join应该是这样的:

select 
    coalesce(t1.A, '0') as A, 
    coalesce(t1.B, '0') as B, 
    coalesce(t1.C, t2.C) as C, 
    coalesce(t2.D, '0') as D, 
    coalesce(t2.E, '0') as E 
from tab1 t1 
full outer join tab2 t2 on t1.c = t2.c; 

结果(SQL Server):

A B C   D E 
---- ---- ----------- ---- ---- 
a b 1   G H 
c d 2   0 0 
e f 3   0 0 
0 0 4   I J 
0 0 5   K L 

而解决方法是做left joinright joinunion

select coalesce(t1.A, '0') as A, 
    coalesce(t1.B, '0') as B, 
    coalesce(t1.C, t2.C) as C, 
    coalesce(t2.D, '0') as D, 
    coalesce(t2.E, '0') as E 
from tab1 t1 
left join tab2 t2 on t1.c = t2.c 
union 
select coalesce(t1.A, '0') as A, 
    coalesce(t1.B, '0') as B, 
    coalesce(t1.C, t2.C) as C, 
    coalesce(t2.D, '0') as D, 
    coalesce(t2.E, '0') as E 
from tab1 t1 
right join tab2 t2 on t1.c = t2.c; 

结果(MySQL的):

A B C D E 
--- --- --- --- --- 
a b 1 G H 
c d 2 0 0 
e f 3 0 0 
0 0 4 I J 
0 0 5 K L