DELETE的目标表...不可更新

问题描述 投票:0回答:3

我有这样的疑问

SET @n=0;
DELETE t3 FROM (
         SELECT  id, project_id, task_id, user_id,grouper
                            FROM (  
                                    SELECT  id, project_id, task_id, user_id,
                                    @n:=if(status=55,@n+1,@n),
                                    if(status=55,@n-1,@n) as grouper FROM timelog
                                    WHERE user_id='5' ORDER BY id ASC
                                 ) as t
                where grouper>-1
                group by grouper) as t3 WHERE grouper=1

我收到了

The target table t3 of the DELETE is not updatable

这个错误有什么解决办法吗?
基本上我正在尝试使用 select in delete 删除标有

grouper
的表行组。我也很高兴有与此不同的其他解决方案或想法。

sql小提琴:http://sqlfiddle.com/#!2/33820/2/0

编辑:感谢您的回答,这里是工作代码(如果有人需要类似的东西):

SET @n=0;
delete from timelog where id in  ((SELECT  id
                    FROM (  
                            SELECT  id, project_id, task_id, user_id,
                            @n:=if(status=55,@n+1,@n),
                            if(status=55,@n-1,@n) as grouper FROM timelog
                            WHERE user_id='5' ORDER BY id ASC
                         ) as t
        where grouper>-1 and grouper=1
        group by grouper))
mysql sql database
3个回答
1
投票

希望我有更多时间...但是快速伪代码...

delete from timelog where id in  ((SELECT  id
                        FROM (  
                                SELECT  id, project_id, task_id, user_id,
                                @n:=if(status=55,@n+1,@n),
                                if(status=55,@n-1,@n) as grouper FROM timelog
                                WHERE user_id='5' ORDER BY id ASC
                             ) as t
            where grouper>-1
            group by grouper) as t3 WHERE grouper=1)

我所做的就是将 subselect 语句更改为 where 子句,该子句仅返回原始子查询中列出的 ID。

编辑 - 括号有点不对,我想我现在有了。 说实话,这确实可以清理为一条 select 语句,而不是这里的嵌套版本。


0
投票
delete from dept_new where rowid in(
 select rowid from(
  select 
     rowid,
     row_number() over(partition by deptno,dname,loc order by deptno) rownu 
 from dept_new) 
where rownu>1);

0
投票

从表名中删除 rowid in( 从( 选择 罗伊德, 行数()超过( 按[唯一性所需的列]分区 order by [列顺序,以便第一行是您要保留的行] ) 行号 来自表名) 其中 row_num>1);

上面的例子:

从 dept_new 中删除 rowid in( 从( 选择 罗伊德, row_number() over(按 deptno,dname,loc order by deptno) row_num 来自新部门) 其中 row_num>1);

rowid 是 mysql 表中每一行的唯一行标识符。 您只需从要删除的每一列(窗口函数内的行号大于 1 的列)中挑选出 rowid,然后使用引用这些行 id 的 delete from 命令删除所有这些列。

© www.soinside.com 2019 - 2024. All rights reserved.