无法从子查询中的同一表中删除

Posted

技术标签:

【中文标题】无法从子查询中的同一表中删除【英文标题】:Cannot delete from same table in subquery from 【发布时间】:2014-04-04 11:27:19 【问题描述】:

我知道这个论点已经在这个网站上讨论过很多次了,我只是找不到一个可行的解决方案,所以我想我会把我的具体案例发给你,也许你可以帮助我......

我有一个音乐节,我需要从中剔除低于前一天晚上平均评价 20% 的歌曲。

我试过这个:

DELETE FROM concorre AS C 
WHERE C.dataSer='2014-02-24' 
AND C.votoTot<(SELECT AVG(B.votoTot) 
               FROM concorre AS B 
               WHERE B.dataSer='2014-02-23')/5 

它解决了“同表问题”但仍然给我一个错误:

#1064 - 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 1 行的 'AS C WHERE C.dataSer='2014-02-24' AND C.votoTot

【问题讨论】:

由于您的子查询将为所有条目返回相同的值,您是否考虑过使用参数,这将消除与子查询相关的错误并可能提高性能。 在命名表时不应该使用AS。那就是当您命名列时,您可以使用AS 【参考方案1】:

试试这个

DELETE c FROM concorre C 
JOIN (SELECT AVG(B.votoTot) average FROM concorre B WHERE B.dataSer='2014-02-23') d
WHERE C.dataSer='2014-02-24' 
AND C.votoTot < d.average /5 

【讨论】:

您的查询有效,非常感谢,但我不明白“DELETE c”是什么意思……什么是 c 这是为了考试,所以我需要确保我理解它的每一个细节 c 是您要从中删除的表的名称。由于您加入了多个表,因此您需要指明从哪个表中删除。 DELETE c FROM concorre CDELETE FROM concorre c 将失败,因为删除语句中有超过 1 个表。但是DELETE c 表示要从哪个表中删除与 WHERE 匹配的表。【参考方案2】:

MySQL 不允许在语句的任何子查询中选择外部查询中正在更新/删除的表。

在这里,您将从concorre 表中删除,并在子查询中引用同一个表。

你可以试试这样的:MySQL DELETE FROM with subquery as condition

【讨论】:

以上是关于无法从子查询中的同一表中删除的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询使用同一表中的值更新表

从同一查询中的两个表中删除 NULL 行[重复]

OpenSQL 中的 WHERE 变量 = ( 子查询 )

查询语言系列—JOIN 语句

Oracle:如何通过将子查询删除到条件或加入同一张表来提高查询?

从子查询存储过程分配变量