我需要更新来自SELECT
语句的记录列表,我正在尝试使用这种类型的语句,但是在语句格式方面遇到错误:
UPDATE
noleggio_veicoli
SET
data_esportazione = CURDATE()
WHERE id IN
(SELECT id FROM noleggio_veicoli WHERE id_convenzionato = 3);
但是它只是返回:
错误代码:1093。您无法指定目标表'noleggio_veicoli' 在FROM子句中更新
MySQL 似乎只能运行经典的UPDATE
,即:
UPDATE
noleggio_veicoli
SET
data_esportazione = CURDATE()
WHERE
id_convenzionato = 3;
不幸的是,这不是我所需要的,因为我需要链接到SELECT
语句的UPDATE
查询更加复杂,并且取决于SQL Server中已经定义的 Views 。 / p>
答案 0 :(得分:1)
就像@Maxim所说的,你应该做类似的事情
CREATE TEMPORARY TABLE IF NOT EXISTS temp AS (
SELECT id FROM noleggio_veicoli where id_convenzionato=3
);
update noleggio_veicoli set data_esportazione=curdate()
where id in (select id from temp);
答案 1 :(得分:0)
如果您要更新与select p.id from parent p inner join child c on c.pid=p.id left join child2 c2 on c.x=c2.y where c.xx=yy and p.x=y...
匹配的数据,可以执行以下操作:
update parent p
set aaa=bbbb
from child c
left join child2 c2 on c.x=c2.y
where c.pid=p.id and c.xx=yy and p.x=y ...
答案 2 :(得分:0)
您可以使用join
进行指定:
UPDATE noleggio_veicoli nv JOIN
noleggio_veicoli nv3
ON nv.id = nv3.id and nvid3.id_convenzionato = 3
SET data_esportazione = curdate();
答案 3 :(得分:0)
出于某种奇怪的原因,MySql不允许引用在一级子查询中更新的同一张表。
但是您可以通过子查询接收解决此问题。 (可能不是一个真实的词)
即在子查询中使用子查询。
使用IN
的示例:
UPDATE noleggio_veicoli
SET data_esportazione = current_date
WHERE id IN (select id from (select id from noleggio_veicoli where id_convenzionato = 3) q);
它也可以与EXISTS
一起使用:
UPDATE noleggio_veicoli as t
SET data_esportazione = current_date
WHERE EXISTS
(
select 1
from (select id, id_convenzionato from noleggio_veicoli) as t2
where t2.id_convenzionato = 2
and t2.id = t.id
);
您可以在 rextester
上对其进行here测试答案 4 :(得分:-1)
您不能同时更新和读取一张表。首先,您必须 选择必要的ID并将其保存到某个地方,例如保存到temporary table