MySQL表合并
问题描述:
反正是有由柱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个结果?
答
这一个曾在我的测试:
(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
答
这是做的最好的例子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 join
和right join
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
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
删除,忽略了左表也是空的一些值;) – Aufziehvogel 2011-12-31 17:27:52
什么左加入+右加入+联合。也许像这样(SELECT ... LEFT JOIN ...)UNION(SELECT ... RIGHT加入t1.c = t2.c和t1.c IS NULL)。在第一部分会给你所有的都带有一个NULL,而在第二部分都带有一个NULL。 – Aufziehvogel 2011-12-31 17:33:33
与连接一起选择不同的C? – Dimme 2011-12-31 17:34:45