UPDATE语句更新自连接表

最近计算数据时,需要用UPDATE对表进行更新,条件还是在当前表中,于是很直观地写了SQL语句进行更新,没想到语句是错误的,经过查询手册终于知道了问题所在,也重新学习了一下UPDATE语句。

1 要解决的问题
base2015表同时存在2015年和2016年的保单数据,现在要对其中2015年9月的数据进行更新,标记出哪些在2016年已经续回,是否续回的标准是VIN码加险种(VINAndRisk,有索引)相同。
2 错误的作法
UPDATE base2015
SET isRenew=’是’
WHERE enddate>=’2015-8-31′ AND enddate<=’2015-9-29′ AND VINandRisk IN
(
SELECT VINandRisk
FROM base2015
WHERE startdate>=’2016-9-1′ AND startdate<=’2016-9-30′
);
提示的信息是:You can’t specify target table ‘base2015’ for update in FROM clause.意思是在FROM语句中不能包括要被更新的表。
3正确的作法
UPDATE base2015 AS part2015 INNER JOIN  base2015 AS part2016 ON part2015.VINandRisk =part2016.VINandRisk
SET part2015.isRenew=’是’
WHERE part2015.endDate>=’2015-08-31′ AND part2015.endDate<=’2015-09-29′
AND part2016.startDate>=’2016-09-01′ AND part2016.startDate<=’2016-09-30′;
或者:
UPDATE base2015 AS part2015,base2015 AS part2016
SET part2015.`isRenew`=’是’
WHERE part2015.endDate>=’2015-08-31′ AND part2015.endDate<=’2015-09-29′
AND part2016.startDate>=’2016-09-01′ AND part2016.startDate<=’2016-09-30′
AND part2015.`VINandRisk`=part2016.`VINandRisk`;
执行结果正确,而且速度很快,就是同一个表base2015设置有两个别名part2015和part2016,当作两个表用。
4 UPDATE语法总结
经过查询手册,了解到UPDATE有两种使用方法,一种适合更新单表,一种适合更新多表。
4.1 更新单表
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 …]
[WHERE where_definition]
[ORDER BY …]
[LIMIT row_count];
LOW_PRIORITY意思是降低优先级,即不加锁,这样进行多用户操作时,不影响其他用户进行读取等操作;
IGNORE用处是当要插入的数据主键/索引在数据表中存在时不提示错误正常运行,也可以使用REPLACE来替代;
ORDER BY配上LIMIT适合这样的场景:对成绩排名前十的人员信息进行更新
4.2 更新多表
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1=expr1 [, col_name2=expr2 …]
[WHERE where_definition];

《UPDATE语句更新自连接表》上的一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注