替换更新具有IN和NOT IN的查询

时间:2018-03-21 17:42:04

标签: mysql sql

我正在尝试更新一个包含大约18000条记录的表,但是我遇到了性能问题。

表名:emp

列名:

id VARCHAR(10),
status CHAR(1),
division VARCHAR(3)

表2名称:emp2

id VARCHAR(10),
status CHAR(1),
division VARCHAR(3),
code VARCHAR(3)

所以,我正在触发以下更新查询:

UPDATE emp
set status = 'X'
where status = 'Y'
and id NOT IN 
   (
   SELECT id from emp2 where id like 'e%'
   and division IN
         (
           SELECT DISTINCT division from emp2 where code in ('ABC','XYZ')
         )
   );

查询似乎很好但是会产生很多性能问题。我用Google搜索了解可以使用inner join代替INleft join代替NOT IN

但我发现很难在查询中加入这些内容。所以,我想知道是否有替代此更新查询。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

可能类似于以下内容,但请确保在运行更新之前在SELECT中使用相同的查询,以便进行检查。

UPDATE emp
set status = 'X'
FROM EMP E
LEFT JOIN emp2 E2 on E2.id = E.ID AND E2.id like 'e%' AND E2.division in (SELECT DISTINCT division from emp2 where code in ('ABC','XYZ'))
where E2.id IS NULL
AND E.status = 'Y'

抽查

select E.id, E.status, 'X' AS ToStatus
FROM EMP E
LEFT JOIN emp2 E2 on E2.id = E.ID AND E2.id like 'e%' AND E2.division in (SELECT DISTINCT division from emp2 where code in ('ABC','XYZ'))
where E2.id IS NULL
AND E.status = 'Y'