【发布时间】:2017-06-09 18:28:39
【问题描述】:
假设我有一个带有数据的表测试:
SOID SO_Name SO_Desc PRIORITY ADE_PRIORITIZED DEPLOY_DATE ENV
123 SO1 SO1 Desc1 111 Y 01-JAN-01 0
123 SO1 SO1 Desc1 111 Y 01-JAN-01 1
123 SO1 SO1 Desc1 111 Y 01-JAN-01 2
123 SO1 SO1 Desc1 111 Y 01-JAN-01 3
987 SO1 SO1 Desc1 111 Y 01-JAN-01 0
987 SO1 SO1 Desc1 111 Y 01-JAN-16 1
987 SO1 SO1 Desc1 111 Y 21-JAN-17 2
987 SO1 SO1 Desc1 111 Y 01-JAN-17 3
121 SO121 SO121 Desc121 111 Y 01-JAN-17 0
我想删除每个 soid 的重复行(重复可以基于 4 列:so_name、so_desc、priority、ade_prioritized)保留具有最高 deploy_date 的行。
我使用了这个查询,但它没有删除任何行。
delete from so_test a
where a.deploy_date < (
select max(b.deploy_date) from so_test b where a.soid = b.soid
);
0 rows deleted
我期望的最终结果应该是: SOID SO_Name SO_Desc PRIORITY ADE_PRIORITIZED DEPLOY_DATE ENV 123 SO1 SO1 描述 111 是 01-JAN-01 0 987 SO1 SO1 描述 111 是 21-JAN-17 2 987 SO1 SO1 Desc1 111 Y 21-JAN-17 2
可能是什么问题? 没有CTE可以吗?
【问题讨论】:
-
鉴于该数据,将删除零行,因为零行符合条件。对于 SOID=123,所有部署日期都是相同的......所以没有一个小于最大值。对于 SOID=121,只有一行,所以没有一个小于最大值。
-
您可以使用 CTE(公用表表达式)和 Row_Number() 来做您想做的事……但是那边的“ENV”列是什么?你为什么不直接删除 ENV > 0 的地方?
-
你用 mysql、sql server 和 oracle 标记了这个。是哪个?
-
@pmbAustin - 我已经编辑了它。现在可以检查了吗?
标签: mysql sql-server oracle duplicates sql-delete