我有一个如下所示的表
应该是唯一标识符的地方,drg,不是,所以我开始接受修复它的个人挑战。我可以通过多种方式轻松做到这一点,但我正在尝试以不同的方式做一些事情来学习一些新技术。需要从表中删除的是任何 drg不唯一且 eff_date **小于 ** max eff_date 的行。
为了找到我需要的东西,我使用了
select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc
from drgtable d1
inner join drgtable d2 on d1.drg=d2.drg
group by d1.drg,d2.drgdesc
having MAX(d1.eff_date) = MAX(d2.eff_date)
我不想将其选择到新表中并删除旧表,而是希望在删除语句中执行此操作。
我对下面看起来很奇怪的查询的处理过程是从我使用的上述查询中找到不在表中的行并删除它们。我接近了,但被卡住了。另外,如果有更简单的方法可以做到这一点,请告诉我。谢谢
-- 这样做的目的是找到 d3 中不在 d4 中的行并删除它们。没那么远
delete from
drgtable
where
(
select * from drgtable as d3
left join
(
select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc
from drgtable d1
inner join drgtable d2 on d1.drg=d2.drg
group by d1.drg,d2.drgdesc
having MAX(d1.eff_date) = MAX(d2.eff_date)
) d4 on d4.drg =d3.drg and d4.maxEffDate = d3.eff_date and d3.drgdesc = d4.drgdesc
)