我有这样的疑问
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))
希望我有更多时间...但是快速伪代码...
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 语句,而不是这里的嵌套版本。
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);
从表名中删除 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 命令删除所有这些列。