【问题标题】:Derived table not allowed for delete派生表不允许删除
【发布时间】:2017-05-11 20:03:10
【问题描述】:

我的数据看起来像 -

+-------+------------+------------+
|  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 |
+-------+------------+------------+

我希望它是怎样的 -

+-------+------------+------------+
|  ID   | START_DATE |  END_DATE  |
+-------+------------+------------+
| 12345 | 11/09/2008 | 02/02/2011 |
| 12345 | 02/02/2011 | 12/31/9999 |
+-------+------------+------------+

基本上我会删除 IDSTART_DATE 列下的重复项,并保留最新的 END_DATE 一个

我的查询 - 使用它我可以看到重复项

 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 查询工作得很好,但是当我尝试 DELETE 使用像这样的相同查询时 -

 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] [Teradata][ODBC Teradata 驱动程序][Teradata 数据库] 语法错误:派生表不允许删除。

我的问题 -

有没有一种方法可以在不进入派生表的情况下删除这些骗子,或者以任何其他方式在不使用派生表的情况下转换当前查询

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    如果您在(id, start_date, end_date) 上没有重复项,那么您可以这样做:

    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
                           );
    

    【讨论】:

    • 这是删除所有记录。
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 这不会删除两条记录吗?因为 ID 将与两个条目匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2015-05-13
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多