SQL更新记录列表来自select

时间:2018-09-08 11:37:19

标签: mysql sql

我需要更新来自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>

5 个答案:

答案 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