派生 table 不允许删除
Derived table not allowed for delete
我的数据看起来像-
+-------+------------+------------+
| 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 |
+-------+------------+------------+
基本上我删除了 ID 和 START_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
我得到提示 -
ERROR [42000] [Teradata][ODBC Teradata Driver][Teradata Database]
Syntax error: derived table not allowed for delete.
我的问题-
有没有一种方法可以在不进入派生表的情况下删除这些重复项,或者有什么方法可以在不使用派生表的情况下转换当前查询
如果您在 (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
);
您可以删除第一个查询选择的记录并使用它们的 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 | 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 |
+-------+------------+------------+
基本上我删除了 ID 和 START_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
我得到提示 -
ERROR [42000] [Teradata][ODBC Teradata Driver][Teradata Database] Syntax error: derived table not allowed for delete.
我的问题-
有没有一种方法可以在不进入派生表的情况下删除这些重复项,或者有什么方法可以在不使用派生表的情况下转换当前查询
如果您在 (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
);
您可以删除第一个查询选择的记录并使用它们的 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)