【问题标题】:MySQL - Combine two tables into third without duplicatesMySQL - 将两个表组合成第三个没有重复的表
【发布时间】:2013-05-16 15:09:40
【问题描述】:

我很难在这里围绕一个概念来思考。我拥有的是三个结构相同的表。我需要将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 是什么并不重要,因为它们永远不会被使用。

【问题讨论】:

    标签: mysql select insert duplicates


    【解决方案1】:

    目标是将Table1的内容插入Table3,将Table2中不在Table1的内容插入Table3。以下查询正是这样做的。

    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);
    

    【讨论】:

      【解决方案2】:

      我在 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 |
      +------+---------+---------+---------+
      

      【讨论】:

        【解决方案3】:

        您可以使用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
        

        【讨论】:

        • select distinct代替group by不是更好吗?
        • 在这种情况下,我不这么认为。我的第一个想法是 DISTINCT,然后因为他从两个表中获取值,我认为是 UNION,但他正在检查四列中的三列的唯一性 - ID 不必是不同的。
        • 这确实奏效了,尽管我不得不为查询分配更多资源......鉴于每个 table1table2 中大约有 500,000 行,它将数据服务器固定了近一个小时-- 这样我们就可以存档这些表并重新开始......感谢您的解决方案!
        猜你喜欢
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 2018-10-14
        • 2014-08-19
        相关资源
        最近更新 更多