比较MySQL中的两个表

时间:2013-09-16 19:09:00

标签: mysql sql left-join inner-join

我有一个主表和临时表,看起来像:

  • things_temp

    +----+--------+--------------+
    | id | number | current_time |
    +----+--------+--------------+
    |  1 |    456 | 9/16/2013    |
    |  2 |    123 | 9/16/2013    |
    +----+--------+--------------+
    
  • things_master

    +----+--------+--------------+-----+
    | id | number | last_updated | old |
    +----+--------+--------------+-----+
    |  1 |    456 | 9/15/2013    |   0 |
    |  2 |    234 | 9/15/2013    |   0 |
    |  3 |    888 | 8/14/2012    |   1 |
    +----+--------+--------------+-----+
    

我需要遍历things_temp表格,如果numberthings_master中存在相同的old == 0,请将last_updated更新为{ {1}}。

否则,如果不满足上述两个条件,只需将记录从current_time添加到things_tempthings_masterlast_updatedcurrent_time

现在,我可以轻松获得old = 0的计数并单独检查每一个。但每张桌子上有40,000条记录,所以我认为这可能是一个坏主意。

我一直在环顾四周,有things_tempUNION ALLLEFT JOIN之类的东西似乎都可能是解决方案的一部分,但我有点丢失。

有没有更好的方法来完成我的任务而不遍历INNER JOIN的每条记录并搜索things_temp

1 个答案:

答案 0 :(得分:0)

您可以通过滥用replace into在一个声明中执行此操作,但通过两个步骤执行此操作可能更为清晰。其他数据库支持merge,这是专为此类事情而设计的。

start transaction;

-- update any matching numbers with the data from thing_temp
update 
    things_master m 
        inner join 
    things_temp t
        on m.number = t.number
set
    m.last_updated = t.`current_time`
where
    m.old = 0;

-- add any missing numbers
insert into 
    things_master (number, last_updated, old)
Select
    number, `current_time`, 0
From
    things_temp t
Where
    not exists (
        select
            'x'
        from
            things_master m
        where
            t.number = m.number and
            m.old = 0
    );

commit transaction;