Update修改一批数据
UPDATE t1
SET v1=v2,
WHERE
id IN (
SELECT
id
FROM
t1
WHERE
v1=''
UNION ALL
SELECT
id
FROM
t1
WHERE
v2=''
);
报错:
1093 - You can’t specify target table ‘t1’ for update in FROM clause
修改:
You can’t specify target table ‘表名’ for update in FROM clause
翻译为:不能先select出同一表中的某些值,再update这个表(在同一语句中)
结果表就是一个临时表,不能在这上面进行update。
也就是说需要把结果集当作一个表,自我查询一遍
格式为:SELECT colunm1 FROM (结果集) a
需要把临时表不被当成临时表,把自己跑一遍,修改内层语句
SELECT
id
FROM
(
SELECT
id
FROM
t1
WHERE
v1=''
UNION ALL
SELECT
id
FROM
t2
WHERE
v2=''
)
报错:
1248 - Every derived table must have its own alias
原因: 需要给临时表起名
这句话的意思是说每个派生出来的表都必须有一个自己的别名
一般在多表查询时,会出现此错误。
因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
把MySQL语句改成:select count(*) from (select * from ……) as total;
问题就解决了,虽然只加了一个没有任何作用的别名total,但这个别名是必须的
SELECT
id
FROM
(
SELECT
id
FROM
t1
WHERE
v1=''
UNION ALL
SELECT
id
FROM
t2
WHERE
v2=''
) table1
可查出再复制到update语句
UPDATE t1
SET v1=''
WHERE
id IN (
SELECT
id
FROM
(
SELECT
id
FROM
t1
WHERE
v1=''
UNION ALL
SELECT
id
FROM
t2
WHERE
v2=''
) table1
);