Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在查找子查询上引用主表以进行更新时出错_Mysql_Lookup_Mysql Error 1093 - Fatal编程技术网

Mysql 在查找子查询上引用主表以进行更新时出错

Mysql 在查找子查询上引用主表以进行更新时出错,mysql,lookup,mysql-error-1093,Mysql,Lookup,Mysql Error 1093,首先,这个问题之前没有得到回答,因为关于错误1093的线程显示了一个简单的子查询。在我的例子中,我正在查找引用主表的下一条记录。请不要在没有阅读整个问题之前将其标记为重复 我需要使用下一条记录的数据(根据gkey字段,它是连续的int主键)更新具有错误日期(1970-01-01)的表的记录 因此,如果我执行此查询: SELECT aa.gkey, aa.course_date, (select course_date from BI.fact_training_eve

首先,这个问题之前没有得到回答,因为关于错误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_date
from BI.fact_training_event_tbl aa
where course_date = '1970-01-01'
如预期的那样,它会正确地显示记录:

gkey   course_date  next_date
====   ===========  =========
4103   1970-01-01   2017-03-23
4884   1970-01-01   2017-03-22
5047   1970-01-01   2017-03-23
我现在需要用下一个日期更新课程日期字段,但如果我尝试运行以下命令:

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\U training\U event\U tbl”

我尝试执行此处建议的操作:,将查询嵌套在另一个查询中:

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'
但我得到的只是将课程日期设置为空,而不是下一个课程日期

如果我尝试像这样引用主表:

where cc.gkey > BI.fact_training_event_tbl.gkey

上面写着:未知栏BI.fact\U training\U event\U tbl.gkey或zz.gkey


关于如何实现这一点,您有什么想法吗?

出现
1093
错误的根本原因是MySQL无法访问您想要第二次更新的表,并且直接依赖于该表

尽管您链接的变通方法看起来像是在原始子查询周围添加了一个
select
-层,例如
select*from(您的原始子查询)
,但您忽略了它们工作的原因:它们使用派生表而不是(依赖)子查询(这就是@Cheekysoft在您的子查询中使用隐式临时表的意思). 派生表不能依赖于外部查询(因此根本问题消失了)。它或多或少被视为与任何实际表类似(注意,例如,您必须命名一个派生表,在您的示例中为
aa
;请参阅,例如,以获取有关此的更多详细信息)

但这也意味着您不能在这里使用对外部表的任何依赖,不管您如何想欺骗MySQL这样做。例如,由于此时无法访问外部查询以供参考,因此您将获得未知列错误

因此,基本策略是将所有需要的行放入派生表中,然后执行
join
以选择需要更新实际行的行:

update fact_training_event_tbl
join ( your original select that returns 3 rows ) base
on base.gkey = fact_training_event_tbl.gkey
set course_date = base.course_date
“在”派生表(
base
)的“内部”,您可以做任何您想做的事情,并可以随时使用
fact\u training\u event\u tbl
,但是对外部
fact\u training\u event\u tbl
的依赖性是在
base
的“外部”通过
on
条件完成的

由于
base
不仅是一个(派生)表,而且
fact\u training\u event\u tbl
也是一个(实际)表,因此通常也可以这样做

update fact_training_event_tbl
join fact_training_event_tbl base
on base.gkey = fact_training_event_tbl.gkey + 1
set course_date = base.course_date

在您的例子中,如果您的字面意思是“gkey字段,它是连续的int主键”(因此没有间隙),那么这将起作用。但即使不是这样,它也应该说明在这种情况下使用普通表和派生表之间的相似性。

导致
1093
错误的根本原因是MySQL无法访问您想要第二次更新的表,并且直接依赖于该表

尽管您链接的变通方法看起来像是在原始子查询周围添加了一个
select
-层,例如
select*from(您的原始子查询)
,但您忽略了它们工作的原因:它们使用派生表而不是(依赖)子查询(这就是@Cheekysoft在您的子查询中使用隐式临时表的意思). 派生表不能依赖于外部查询(因此根本问题消失了)。它或多或少被视为与任何实际表类似(注意,例如,您必须命名一个派生表,在您的示例中为
aa
;请参阅,例如,以获取有关此的更多详细信息)

但这也意味着您不能在这里使用对外部表的任何依赖,不管您如何想欺骗MySQL这样做。例如,由于此时无法访问外部查询以供参考,因此您将获得未知列错误

因此,基本策略是将所有需要的行放入派生表中,然后执行
join
以选择需要更新实际行的行:

update fact_training_event_tbl
join ( your original select that returns 3 rows ) base
on base.gkey = fact_training_event_tbl.gkey
set course_date = base.course_date
“在”派生表(
base
)的“内部”,您可以做任何您想做的事情,并可以随时使用
fact\u training\u event\u tbl
,但是对外部
fact\u training\u event\u tbl
的依赖性是在
base
的“外部”通过
on
条件完成的

由于
base
不仅是一个(派生)表,而且
fact\u training\u event\u tbl
也是一个(实际)表,因此通常也可以这样做

update fact_training_event_tbl
join fact_training_event_tbl base
on base.gkey = fact_training_event_tbl.gkey + 1
set course_date = base.course_date

在您的例子中,如果您的字面意思是“gkey字段,它是连续的int主键”(因此没有间隙),那么这将起作用。但即使不是这样,它也应该说明在这种情况下使用普通表和派生表之间的相似性。

报告了最终有效的查询,感谢solarflare提供的解决方案:

update fact_training_event_tbl orig
join ( 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_date
from BI.fact_training_event_tbl aa
where course_date = '1970-01-01' ) base
on base.gkey = orig.gkey
set orig.course_date = base.next_date

报告最终有效的查询,感谢solarflare提供的解决方案:

update fact_training_event_tbl orig
join ( 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_date
from BI.fact_training_event_tbl aa
where course_date = '1970-01-01' ) base
on base.gkey = orig.gkey
set orig.course_date = base.next_date

明亮的我周末很忙,但周一早上第一件事就是测试一下,然后回来报告。这正是我需要的。非常感谢您的帮助。非常好!它就像一个符咒。下面是最后一个查询。非常感谢,太棒了。我周末很忙,但周一早上第一件事就是测试一下,然后回来报告。这正是我需要的。非常感谢您的帮助。非常好!它就像一个符咒。下面是最后一个查询。非常感谢你。