在MySQL中使用WITH和Partition删除表中的多行

disho6za  于 2023-05-05  发布在  Mysql
关注(0)|答案(2)|浏览(248)

我试图删除多个重复的行/数据,但问题是MySQL说:

1064 -您的SQL语法中有一个错误;检查与您的MariaDB服务器版本对应的手册,以在第6行的“DELETE FROM studentTable WHERE RowNumber〉1”附近使用正确的语法

下面是我的代码:

WITH studentTable AS
(
   SELECT *, ROW_NUMBER() OVER(PARTITION BY studentID ORDER BY studentID) AS RowNumber
   FROM student_quiz
)
DELETE FROM studentTable WHERE RowNumber > 1;

以下是选择版本的结果:enter image description here
我在youtube上发现了这段代码,这段视频是11年前上传的,所以我不确定这段代码是否还能在当前版本的MySQL中工作。我希望你能帮我解决这个问题。谢谢大家!

gzszwxb4

gzszwxb41#

MySQL和MariaDB都不支持可更新的CTE。

  • 如果 * 你的表有一个主键,比如pk,那么我推荐一个简单的自连接:
delete q
from student_quiz q
inner join (select id, min(pk) pk from student_quiz group by id) q1
    on q1.id = q.id and q1.pk < q.pk

基本上,对于每个id,这将保留具有最小pk的行,并删除其他行(如果有的话)。

lyr7nygr

lyr7nygr2#

由于CTE是不可更新的,因此需要参考原始表使用JOIN删除行:

WITH studentTable AS
(
   SELECT *, ROW_NUMBER() OVER(PARTITION BY studentID ORDER BY studentID) AS RowNumber
   FROM student_quiz
)
DELETE FROM student_quiz
USING student_quiz join studentTable on student_quiz.id = studentTable.id
WHERE studentTable.RowNumber > 1;

Demo here

相关问题