请教,mysql update where not exists同一张表该怎么写?

sweetBug 2013-12-08 08:40:49

update user_address as t
set t.IS_DEFAULT = 1
where t.USER_ID = 'ifelse'
and not exists (
select 1 from user_address i
where i.USER_ID = t.USER_ID and ifnull(i.IS_DEFAULT, 0) = 1
) and t.ADDRESS_ID in (
select min(i.ADDRESS_ID)
from user_address i
where i.USER_ID = t.USER_ID
)

如题,我想要更新地址表用户“ifelse”的“默认地址”列,当发现该用户的地址列表中没有任何一条地址被设置成默认地址,则设置编号最小的地址为默认地址。

这个SQL在ORACLE或SQLSERVER中执行是没有问题的,在MYSQL中执行报错:
Error:2013-12-08 20:39:51 0:00:00.000: Lookup Error - MySQL Database Error: You can't specify target table 't' for update in FROM clause

这是应该怎么写呢,求帮助!
...全文
1262 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweetBug 2013-12-08
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
把 not exists 转换成 left join .. update a left join (select ... ) as c on a.id=c.id set a.x=1 where c.id is null
谢谢你的帮助,我写出来这个SQL了

update user_address t inner join (
	select t.USER_ID, ifnull(sum(t.IS_DEFAULT), 0) isDefault 
	from user_address t where t.USER_ID = 'ifelse'
	group by t.USER_ID
) i on i.USER_ID = t.USER_ID
inner join (
	select t.USER_ID, min(t.ADDRESS_ID) minAddressId 
	from user_address t where t.USER_ID = 'ifelse'
	group by t.USER_ID
) j on j.USER_ID = t.USER_ID
set t.IS_DEFAULT = 1
where i.isDefault <= 0 and j.minAddressId = t.ADDRESS_ID
ACMAIN_CHM 2013-12-08
  • 打赏
  • 举报
回复
把 not exists 转换成 left join .. update a left join (select ... ) as c on a.id=c.id set a.x=1 where c.id is null

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧