如何在更新语句的“set”部分中引用正在更新的表?

时间:2017-10-31 20:49:52

标签: mysql sql sql-update alias

我正在使用MySQL 5.5.37。我想更新一个表,我想使用我希望在我用来获取更新值的查询子句中更新的特定行的值。所以,举个例子,我就像这样对我的表进行别名

update session ts set

所以我想在语句的“set”部分引用“ts.id”,如果可能的话。我试过了

update session ts set user_id = (select q.* from
  (select u.id FROM session t, training_session_org tso, organization o, user u
   where o.user_id = u.id and tso.organization_id = o.id
     and t.id = tso.training_session_id and t.id = ts.id) q);

但我得到了一个

ERROR 1054 (42S22): Unknown column 'ts.id' in 'where clause'

如果可能的话,在查询中引用我更新的表的正确方法是什么?另外,我想在一个SQL语句中执行此操作,而不是多个SQL语句。

1 个答案:

答案 0 :(得分:0)

问题是您正在使用双子查询并且ts.id超出内部查询范围,我怀疑您尝试使用它来避免错误:

  

您无法在FROM子句

中为更新指定目标表'ts'

但是解决方案只是省略了子查询中的session表,因为你不需要它:

update session set user_id = (select u.id
  from training_session_org tso 
  join organization o on o.id = tso.organization_id
  join user u on u.id = o.user_id
  where tso.training_session_id=session.id)

事实上,基于联接,​​您甚至可以进一步简化查询:

update session set user_id = (select o.user_id
  from training_session_org tso 
  join organization o on o.id = tso.organization_id
  where tso.training_session_id=session.id)