首先,由于有关错误1093的线程显示了一个简单的子查询,因此较早未回答此问题。就我而言,我正在查找引用主表的下一条记录。请先阅读整个问题,然后再将其标记为重复项。我需要使用下一条记录的数据(根据gkey字段,它是连续的int主键)来更新日期错误(1970-01-01)的表的记录。因此,如果我执行以下查询:SELECT aa.gkey, aa.course_date, (select course_date from BI.fact_training_event_tbl bb where bb.gkey = ( select min(cc.gkey) from BI.fact_training_event_tbl cc where cc.gkey > aa.gkey)) as next_datefrom BI.fact_training_event_tbl aawhere course_date = '1970-01-01'它按预期正确地带来了记录:gkey course_date next_date==== =========== =========4103 1970-01-01 2017-03-234884 1970-01-01 2017-03-225047 1970-01-01 2017-03-23现在,我需要使用next_date更新course_date字段,但是如果我尝试运行以下内容:update BI.fact_training_event_tbl aa set course_date = (select course_date from BI.fact_training_event_tbl bb where bb.gkey = ( select min(cc.gkey) from BI.fact_training_event_tbl cc where cc.gkey > BI.fact_training_event_tbl.gkey))where course_date = '1970-01-01'我得到错误:  错误代码1093。您无法在FROM子句中指定目标表'BI.fact_training_event_tbl'进行更新我尝试执行此处建议的操作:MySQL Error 1093 - Can't specify target table for update in FROM clause,将查询嵌套在另一个内部:update BI.fact_training_event_tbl as zz set course_date = (select course_date from (select course_date from BI.fact_training_event_tbl as bb where bb.gkey = ( select min(cc.gkey) from BI.fact_training_event_tbl as cc where cc.gkey > gkey)) as aa )where course_date = '1970-01-01'但我得到的只是将date_course设置为null,而不是next_date。如果我尝试像这样引用主表:where cc.gkey > BI.fact_training_event_tbl.gkey要么where cc.gkey > zz.gkey它说:未知列BI.fact_training_event_tbl.gkey或zz.gkey。关于如何实现此目标的任何想法? 最佳答案 1093错误的根本原因是MySQL无法直接访问要更新的表,而该表直接依赖该表。即使您链接的变通方法看起来像它们只是在原始子查询周围添加了一个select层,例如select * from (your original subquery),您错过了它们起作用的原因:它们使用派生表而不是(相关的)子查询(@Cheekysoft在您的linked answer中使用隐式临时表的含义)。派生表不能依赖外部查询(因此根本问题就不存在了)。它或多或少像任何实际表一样被对待(注意,例如,您必须命名派生表,在您的情况下为aa;有关此内容的更多详细信息,请参见例如another answer of mine)。但这也意味着,无论您想如何诱骗MySQL,都不能在此使用对外部表的任何依赖关系。你是获得未知的列错误,因为此时外部查询无法访问以供参考。因此,基本策略是将您将需要的所有行放入派生表中,然后执行join来选择更新实际行所需的行:update fact_training_event_tbljoin ( your original select that returns 3 rows ) baseon base.gkey = fact_training_event_tbl.gkeyset course_date = base.course_date在派生表(base)的“内部”,您可以执行所需的任何操作,并可以根据需要频繁使用fact_training_event_tbl,但是对外部fact_training_event_tbl的依赖关系是在base的“外部”完成的,而 -condition。由于不仅on是一个(派生的)表,而且base也是一个(实际的)表,所以通常也可以update fact_training_event_tbljoin fact_training_event_tbl baseon base.gkey = fact_training_event_tbl.gkey + 1set course_date = base.course_date在您的情况下,如果您按字面意思是“ gkey字段,它是连续的int主键”,那么这将起作用(因此不留空格)。但是,即使没有,它也应说明在这种情况下使用普通表和派生表之间的类比。关于mysql - 在查询子查询上引用主表时出错,以进行更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53022722/
10-10 18:50