Update时用到select时发生的问题,一个较特殊的问题

明日在写 mysql 境遇一个比较特殊的难题。 mysql 语句如下: update
wms_cabinet_form set cabf_enabled=0 where cabf_id in ( SELECT
wms_cabinet_form.cabf_id FROM wms_cabinet_form Inner Join
wms_cabinet ON wms_cabinet_form.cabf_cab_id = wms_cabinet.cab_id
Inner Join wms_cabinet_row ON wms_cabinet.cab_row_id
=wms_cabinet_row.row_id where wms_cabinet_row.row_site_id=27 and
wms_cabinet_form.cabf_enabled=1) 运行时建议如下提醒: You can’t
specify target table ‘wms_cabinet_form’ for update in FROM clause 运行
in 里面的 select 字句: SELECT wms_cabinet_form.cabf_id FROM
wms_cabinet_form Inner Join wms_cabinet ON
wms_cabinet_form.cabf_cab_id = wms_cabinet.cab_id Inner Join
wms_cabinet_row ON wms_cabinet.cab_row_id
=wms_cabinet_row.row_id where wms_cabinet_row.row_site_id=27 and
wms_cabinet_form.cabf_enabled=1 能够准确 select
正确结果。再把结果一向写到 in 里面,改后语句如下: update
wms_cabinet_form set cabf_enabled=0 where cabf_id in
,再运转能够精确实施更新。 到这一步初始想不掌握,为何用 select
子句运行会出错呢?曾经在 mssql 这种写法是特不足为奇的。 不能了,独有动用
baidu。找到两条记下。 原本原因是:mysql中不能够这么用。
。那串克罗地亚共和国(Republic of Croatia卡塔 尔(英语:State of Qatar)语错误提示正是说,不可能先select出相近表中的有个别值,
再update那几个表。 也找到代替方案,重写改写了 sql 。 改写后的 sql
如下所示,我们细心分歧一下。 update wms_cabinet_form set
cabf_enabled=0 where cabf_id in ( SELECT a.cabf_id FROM (select
tmp.* from wms_cabinet_form tmp) a Inner Join wms_cabinet b ON
a.cabf_cab_id = b.cab_id Inner Join wms_cabinet_row c ON
b.cab_row_id = c.row_id where c.row_site_id=29 and
a.cabf_enabled=1) 重点在 SELECT a.cabf_id FROM (select tmp.* from
wms_cabinet_form tmp) a ,我 select tmp.* from wms_cabinet_form tmp
作为子集, 然后再 select a.cabf_id FROM 子集,那样就不会 select 和
update 都以同两个表。致此难题得到康健消逝。

本人黄金时代开端选择的Sql:

update
cms_product_provider_properties set value = ‘广东’ where
attribute_id in (select id from  cms_provider_properties_view b ON
a.attribute_id = b.id where b.name =’产地’ and (b.value is null or
b.value = ”))

这种措施足够

后来选取:

update
cms_product_provider_properties set  value = ‘广东’ where
attribute_id in (

SELECT a.attribute_id
FROM (select tmp.* from cms_product_provider_properties tmp) a

发表评论

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