我想合并3个表数据,每个表都有一个数字列,但是所有其他数据都不同。
我想要实现的是从公共列中选择所有数据,并根据number列从所有表中合并其余的列。
请记住,数字列在表之间可以有重复项。
t1
------------------------------
| number | stuff 1 | stuff 2 |
------------------------------
| 1 | x | y |
------------------------------
t2
-------------------------------------------------------
| number | data 1 | data 2 | data 3 | data 4 | data 5 |
-------------------------------------------------------
| 2 | a | b | c | d | e |
-------------------------------------------------------
t3
----------------------------------------------
| number | info 1 | info 2 | info 3 | info 4 |
----------------------------------------------
| 1 | j | k | l | m |
----------------------------------------------
| 3 | j | k | l | m |
----------------------------------------------
Merged Table
------------------------------------------------------------------
| number | stuff 1 | stuff 2 | data 2 | data 5 | info 1 | info 4 |
------------------------------------------------------------------
| 1 | x | y | | | l | m |
------------------------------------------------------------------
| 2 | | | b | e | | |
------------------------------------------------------------------
| 3 | | | | | l | m |
------------------------------------------------------------------
不能重复实际编号,但该数字的3个表之间的任何数据都必须合并为一行。
如果它能执行ON DUPLICATE KEY UPDATE
,那么我可以每隔几天运行一次查询,以添加任何新数据。
提前谢谢你
发布于 2018-05-18 04:58:58
SELECT tt0.number
, tt1.`stuff 1`
, tt1.`stuff 2`
, tt2.`data 2`
, tt2.`data 5`
, tt3.`info 1`
, tt3.`info 4`
FROM ( SELECT t1.number FROM t1
UNION DISTINCT
SELECT t2.number FROM t2
UNION DISTINCT
SELECT t3.number FROM t3
) tt0
LEFT JOIN t1 tt1 ON tt0.number = tt1.number
LEFT JOIN t2 tt2 ON tt0.number = tt2.number
LEFT JOIN t3 tt3 ON tt0.number = tt3.number
此查询假定number
字段是每个表中的主键或至少是唯一键。
不幸的是,这给我带来了错误,说数字中有重复的条目。
如果您有错误,您描述的不是MySQL错误。
发布于 2018-05-22 13:01:53
模式大致类似于以下内容:
create table t1 (
number1 text,
stuff1 text,
stuff2 text);
insert into t1 (number1,stuff1,stuff2) values ('1', 'x', 'y');
create table t2 (
number1 text,
data1 text,
data2 text,
data3 text,
data4 text,
data5 text);
insert into t2 (number1,data1,data2,data3,data4,data5) values('2','a','b','c','d','e');
create table t3 (
number1 text,
info1 text,
info2 text,
info3 text,
info4 text);
insert into t3 (number1,info1,info2,info3,info4) values ('1','j','k','l','m');
insert into t3 (number1,info1,info2,info3,info4) values ('3','j','k','l','m');
通过这个查询,您可以完全实现您想要的结果:
select x.number1,max(stuff1) stuff1,max(stuff2) stuff2,max(data1) data1,max(data2)data2,max(data3) data3,max(data4) data4,max(data5) data5,max(info1) info1,max(info2) info2,max(info3) info3,max(info4) info4
from (
select number1,stuff1,stuff2,null data1,null data2,null data3,null data4,null data5,null info1, null info2, null info3, null info4
from t1
union
select number1,null stuff1, null stuff2,data1,data2,data3,data4,data5,null info1, null info2, null info3, null info4
from t2
union
select number1,null stuff1, null stuff2,null data1,null data2,null data3,null data4,null data5,info1, info2, info3, info4
from t3) x
group by x.number1;
结果是:
+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| number1 | stuff1 | stuff2 | data1 | data2 | data3 | data4 | data5 | info1 | info2 | info3 | info4 |
+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 1 | x | y | NULL | NULL | NULL | NULL | NULL | j | k | l | m |
| 2 | NULL | NULL | a | b | c | d | e | NULL | NULL | NULL | NULL |
| 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | j | k | l | m |
+---------+--------+--------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
https://dba.stackexchange.com/questions/207121
复制相似问题