首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >派生表不允许删除

问派生表不允许删除
EN

Stack Overflow用户
提问于 2017-05-11 11:16:42
回答 2查看 2.1K关注 0票数 0

我的数据看起来像-

代码语言:javascript
复制
+-------+------------+------------+
|  ID   | START_DATE |  END_DATE  |
+-------+------------+------------+
| 12345 | 11/09/2008 | 02/02/2011 |
| 12345 | 11/09/2008 | 11/09/2008 |
| 12345 | 02/02/2011 | 12/31/9999 |
+-------+------------+------------+

我想让它成为-

代码语言:javascript
复制
+-------+------------+------------+
|  ID   | START_DATE |  END_DATE  |
+-------+------------+------------+
| 12345 | 11/09/2008 | 02/02/2011 |
| 12345 | 02/02/2011 | 12/31/9999 |
+-------+------------+------------+

基本上,我正在删除列ID和START_DATE下的副本,并保留最新的END_DATE one。

我的查询-使用这个我可以看到重复的

代码语言:javascript
复制
 SELECT * FROM (SELECT ID,START_DATE,END_DATE,
   ROW_NUMBER() OVER (PARTITION BY ID, START_DATE order by END_DATE desc) RN
 FROM MYTABLE) a WHERE a.RN>1

上面的SELECT查询工作得很好,但是当我尝试使用以下相同的查询删除时-

代码语言:javascript
复制
 DELETE FROM (SELECT ID,START_DATE,END_DATE,
   ROW_NUMBER() OVER (PARTITION BY ID, START_DATE order by END_DATE desc) RN
 FROM MYTABLE) a WHERE a.RN>1

,我收到提示-

错误42000 table驱动程序语法错误:派生表不允许删除。

我的问题-

我是否可以在不使用派生表的情况下删除这些dupe,或者是否有任何其他方法可以不使用派生表来转换当前查询?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-11 11:18:40

如果您在(id, start_date, end_date)上没有副本,那么您可以:

代码语言:javascript
复制
delete from mytable t
    where t.end_date < (select max(t2.end_date)
                        from mytable t2
                        where t2.id = tid and t2.start_date = t.start_date
                       );
票数 3
EN

Stack Overflow用户

发布于 2017-05-11 11:19:48

您可以删除第一个查询选择并使用其ID的记录:

代码语言:javascript
复制
Delete from MYTABLE WHERE ID IN (
 SELECT ID FROM (SELECT ID,START_DATE,END_DATE,
   ROW_NUMBER() OVER (PARTITION BY ID, START_DATE order by END_DATE desc) RN
 FROM MYTABLE) a WHERE a.RN>1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43913848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档