【问题标题】:Insert missing records from one table to another using mysql使用mysql将丢失的记录从一个表插入到另一个表
【发布时间】:2012-10-24 16:02:25
【问题描述】:

我不知道为什么我对这个查询感到困惑。

我有两个表:Table A900 记录和 Table B800 记录。两个表都需要包含相同的数据,但存在一些不匹配。

我需要编写一个 mysql 查询来插入缺失的 100 记录,从 Table ATable B

最后,Table ATable B 应该是相同的。

我不想先截断所有条目,然后再从另一个表中插入。因此,请提供任何帮助。

谢谢。

【问题讨论】:

  • 这里需要有两个查询,第一个查询是从表A到表B上的INSERT记录。第二个查询反之亦然,因为表B的记录可能不在表 A.
  • 如果这是一个非常简单快速的解决方案,为什么你不想截断?
  • John:在这种情况下,表 B 的记录不需要输入到表 A 中。只有 A 表中缺失的条目才会被输入到 B 表中。
  • jcho360:我想知道一种使用脚本而不是使用截断的更好方法。 :)
  • @Rikin 好的,这是你的电话。反正每张表有多少列名?

标签: mysql sql


【解决方案1】:

也可以使用LEFT OUTER JOIN。这将避免子查询开销(当系统可能对外部查询的 每个 记录执行一次子查询时),就像在 John Woo 的回答中一样,并且将避免做不必要的工作覆盖已经存在的 800 条记录,例如 user2340435 的记录:

INSERT INTO b
SELECT a.* FROM a
LEFT OUTER JOIN b ON b.id = a.id
WHERE b.id IS NULL;

这将首先选择 AB 表中的所有行,包括两个表中的所有列,但对于存在于 A 中且不存在于 B 中的行B 表中的所有列将是NULL。 然后它只过滤后面的行(WHERE b.id IS NULL), 最后将所有这些行插入到B 表中。

【讨论】:

  • 更好的选择。在接受的答案中看到“SELECT id FROM table2”让我畏缩@一张有 5000 万行的表......
【解决方案2】:

我认为您可以为此使用IN。 (这是对您的查询的简化

INSERT INTO table2 (id, name)
SELECT id, name
FROM table1
WHERE (id,name) NOT IN 
       (SELECT id, name
        FROM table2);

SQLFiddle Demo

如您在演示中看到的,table2 只有 1 条记录,但执行查询后,table2 上插入了 2 条记录。

【讨论】:

  • 如何插入所有记录,而不仅仅是选定的记录??
  • 你能给出你的表的结构吗?
  • 表一和表二结构相同
  • @Rikin 那么你需要指定所有列名:)
  • 怎么样:INSERT INTO table2 SELECT * FROM table1 WHERE value NOT IN (SELECT value FROM table2);
【解决方案3】:

如果是mysql并且表相同,那么这应该可以:

REPLACE INTO table1 SELECT * FROM table2;

【讨论】:

    【解决方案4】:

    这会将缺失的记录插入到 Table1 中

    INSERT INTO Table2
    (Col1, Col2....)
    (
    SELECT   Col1, Col2,... FROM Table1
    EXCEPT
    SELECT  Col1, Col2,... FROM Table2
    )
    

    然后您可以运行更新查询来匹配不同的记录。

    UPDATE Table2
    SET
    Col1= T1.Col1,
    Col2= T1.Col2,
    FROM
    Table T1
    INNER JOIN
    Table2 T2
    ON
    T1.Col1 = T2.Col1
    

    【讨论】:

      【解决方案5】:

      当使用 group byhaving 子句时,代码也可以工作。经过测试的 SQL 2012 (11.0.5058) Tab1 是包含新记录的源,Tab 2 是要更新的目标。选项卡 2 也有一个身份列。 (是的,伙计们,现实世界并不像实验室作业那样干净整洁)

      INSERT INTO Tab2
      SELECT  a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4,-9,-9,-9,-9,MIN(hits) MinHit,MAX(hits) MaxHit,SUM(count) SumCnt, count(distinct(week)) WkCnt
      FROM Tab1 a 
      LEFT OUTER JOIN Tab2 b ON b.t1 = a.t1 and b.t2 = a.t2 and b.t3 = a.t3 and b.t4 = a.t4 and b.val1 = a.val1 and b.val2 = a.val2  and b.val3 = a.val3  and b.val4 = a.val4 
      WHERE b.t1 IS NULL or b.Val1 is NULL
      group by a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4 having MAX(returns)<4 and COUNT(distinct(week))>2 ;
      

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多