3

我有一个数据库,有几张表。其中一张是客户表,一张是出租表,一张是出租明细表。让我们分别称它们CRRDRDdate_indate_out租用的工具,并R通过RD的主键链接。R链接Ccustomer id

基本上我想做的是选择(并删除)在过去 3 年内没有租过任何东西的客户。所以我不能使用 where date_out > sysdate - 3 years[表示不准确的代码],因为该工具可能在 4 年前和上周也被租出,所以它需要保存在数据库中......我只需要删除没有的工具在过去的 3 年里根本没有租过。

我知道数据库结构迟缓但我无法改变它。

4

2 回答 2

3
delete from c 
where not exists ( select * 
                   from r join rd using(r_id) 
                   where c_id=c.c_id and date_out>add_months(sysdate,-36) )
于 2012-11-28T16:57:07.290 回答
2

如果我正确理解了您的架构,您应该能够编写如下内容:

DELETE
  FROM c
 WHERE c_id NOT IN
        ( SELECT DISTINCT c_id
            FROM r
           WHERE r_id IN
                  ( SELECT r_id
                      FROM rd
                     WHERE date_out > SYSDATE - (365 * 3 + 1)
                  )
        )
;

删除与过去三年的记录c没有对应r记录的所有记录。rd(对于“三年”,我使用了 365 × 3 + 1 天,这有点骇人听闻,但恕我直言,简单明了。如果你愿意,你可以改进它。)

ON DELETE CASCADE请注意,只有当您的外键具有;时,上述内容才能正常工作。如果没有,那么您需要首先删除与这些客户关联的r和记录。rd为此,您可以使用与上述查询相同的方法。

于 2012-11-28T16:52:05.217 回答