如果其他表中的数据不匹配,则更新表

时间:2011-08-30 19:48:44

标签: mysql sql sql-update

两个表的定义(这只是一个例子,我不能合并表,不):

CREATE TABLE `MyTable`(
  `id` int NOT NULL,
  `a` varchar(10) NOT NULL, 
  `b`  varchar(10) NOT NULL,
  `state` tinyint NOT NULL,
  PRIMARY KEY (`id`)
);

目标:使用MyTable2中的“a”或“b”更新不与任何值共​​享的MyTable1记录。

我的解决方案:

update MyTable1 as t1 
  inner join MyTable2 as t2 on (t1.a != t2.a and t1.b != t2.b) 
set t1.state=3;

我基本上是在没有列匹配的表中,所以我可以更新这些记录的状态。

我的问题:这很慢。 MyTable1中的5000个条目和MyTable2中的3000个条目花了6秒钟。

问题:它可以更快(如果你的解决方案变得更快,我也会接受它;)

编辑:我的“解决方案”实际上根本不起作用。

2 个答案:

答案 0 :(得分:2)

您的加入可能会在每行中找到大量的匹配项。这可能会使联接变得非常昂贵。请改为not exists

update  MyTable1 as t1
set     t1.state = 3
where   not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.a = t2.a 
                or t1.b = t2.b
        )

甚至是双子查询:

where   not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.a = t2.a 
        )
        and not exists
        (
        select  *
        from    MyTable2 as t2 
        where   t1.b = t2.b
        )

答案 1 :(得分:0)

这可能会更快:

UPDATE table1 t1 SET t1.state = 3
WHERE t1.id IN
  (SELECT s.id FROM 
     (SELECT T2.id FROM Table1 t2
      LEFT JOIN table2 t3 ON (t2.a = t3.a AND t2.b = t3.b)
      WHERE T3.ID IS NULL
     ) s
  )