使用Max(Date)删除行?

时间:2012-12-03 03:36:27

标签: oracle sqlplus

我正在尝试根据租约日期从桌子上删除一些成员。如果他们没有租用超过3年,他们可以删除。我面临的问题是一些成员最近租用了,这意味着查询仍然会提取他们的ID并删除所有数据,因为他们的记录上有一个日期表明DateOut值大于3年。

delete from (select *
               from rental
                    inner join member
                            on rental.member_id = member.member_id
                    inner join rental_line
                            on rental.rental_id = rental_line.rental_id
              where months_between(sysdate, dateout) > ( 36 )); 

delete from member
 where exists(select dateout
                from rental
               where member.member_id = rental.member_id
                 and months_between(sysdate, rental.dateout) > ( 36 )); 

这是我正在运行以删除数据的两个脚本,它首先从租赁中提取出来,它们是外键中的ON CASCADE,它也从Rental_Line表中提取数据。 然后第二个查询运行以自由地从成员表中删除数据,因为由于先前从链接表中删除了相应的数据而没有任何完整性问题。

1 个答案:

答案 0 :(得分:0)

Delete from rental r where r.member_id in (
  select i.member_id 
  from rental i 
  group by i.member_id 
  having MONTHS_BETWEEN(sysdate, max(dateout))>(36)
);

DELETE FROM Member where not exists(
  Select * 
  from rental 
  where Member.Member_ID =  Rental.Member_ID
);

您刚刚删除了所有租借记录,除非您保留档案,否则您只是在寻找没有租赁的会员。如果不是这种情况,则需要为已清除的member_id创建临时保留表。