MySQL - 将两个表合并为第三个表,不重复

时间:2013-05-21 18:28:43

标签: mysql select insert duplicates

我很难在这里围绕一个概念。我有三个相同结构的表。我需要table 1table 2INSERT INTO table 3合并。我的问题:

table 1table 2内容重复,例外情况为ID。我不会将ID用于除AI以外的任何其他内容,因此这不是一个问题。

我希望完成的一个例子是:

                        original TABLE 1
 _________________________________________________________
|    ID   |      Col 2     |     Col 3    |      Col 4    |
|---------------------------------------------------------|
|   1     |     stuff_1    |     stuff_2  |     stuff_3   |
|---------------------------------------------------------|
|   2     |     stuff_x    |     stuff_y  |     stuff_z   |
|_________________________________________________________|

结合使用
                        original TABLE 2
 _________________________________________________________
|    ID   |      Col 2     |     Col 3    |      Col 4    |
|---------------------------------------------------------|
|   3     |     stuff_1    |     stuff_2  |     stuff_3   |
|---------------------------------------------------------|
|   4     |     stuff_a    |     stuff_b  |     stuff_c   |
|_________________________________________________________|

制作

combined TABLE 3 (notice ID's are not counted in duplicate check)
 _________________________________________________________
|    ID   |      Col 2     |     Col 3    |      Col 4    |
|---------------------------------------------------------|
|   ?     |     stuff_1    |     stuff_2  |     stuff_3   |
|---------------------------------------------------------|
|   ?     |     stuff_x    |     stuff_y  |     stuff_z   |
|---------------------------------------------------------|
|   ?     |     stuff_a    |     stuff_b  |     stuff_c   |
|_________________________________________________________|

我已尝试insert into table 3 select * from table 2;,然后从表1中执行insert ignore。我也尝试了replace into,但由于我省略了ID,因此无效列数已关闭。有没有人有任何想法如何在处理ID问题时将这两者合并到第三个表中?我将重申,ID是什么并不重要,因为它们永远不会被使用。

3 个答案:

答案 0 :(得分:2)

您可以使用GROUP BY展开重复项,同时保留ID值。

这会为您提供唯一的Col1Col2Col3值,并会将ID设置为所有行的最小ID值合并为重复:

INSERT INTO Table3 (ID, Col1, Col2, Col3)
SELECT MIN(ID), Col1, Col2, Col3
FROM (
  SELECT ID, Col1, Col2, Col3 FROM Table1
  UNION SELECT ID, Col1, Col2, Col3 FROM Table2
) Table1And2
GROUP BY Col1, Col2, Col3

根据您发布的数据,结果应为:

ID    Col1     Col2     Col3
--    -------  -------  -------
 1    stuff_1  stuff_2  stuff_3
 2    stuff_a  stuff_b  stuff_c
 4    stuff_x  stuff_y  stuff_z

答案 1 :(得分:0)

我在table3上添加了col2,col3,col4的唯一索引

alter table t3 add unique u1 (col2, col3, col4);

然后做了

insert ignore into t3 select * from t1 union select * from t2;

获取

+------+---------+---------+---------+
| id   | col2    | col3    | col4    |
+------+---------+---------+---------+
|    1 | stuff_1 | stuff_2 | stuff_3 |
|    2 | stuff_x | stuff_y | stuff_z |
|    4 | stuff_a | stuff_b | stuff_c |
+------+---------+---------+---------+

答案 2 :(得分:0)

目标是将Table1的内容插入表3中,并将表2中不在表1中的内容插入表3中。以下查询就是这样做的。

INSERT INTO Table3 (Col1, Col2, Col3)
SELECT Col1,
       Col2,
       Col3
  FROM Table1
UNION
SELECT Col1,
       Col2,
       Col3
  FROM Table2
  WHERE (Col1, Col2, Col3) NOT IN (SELECT Col1, Col2, Col3 FROM Table 1);