如何使用聚合加上哪里查询数据?

时间:2014-09-23 11:22:31

标签: sql oracle

您好,我需要一些初学者的帮助,找到所有贷款借款人的借款人最早贷款的卡号和日期 在2004年1月3日之前还是借过1920年之前出版的书? 我的代码是这样的:

        select l.cardno, MIN(l.dateout)
        from loan l
        where l.isbn in (select b.isbn from book b
        where b.yearpublished < '1920')
        having MIN(l.dateout) <= '03-JAN-04'
        group by l.cardno
        order by l.cardno asc;

2 个答案:

答案 0 :(得分:1)

这是一个有趣的问题,有点棘手。您的方法有两个条件,但必须满足这两个条件,并且问题要求or。这为您提供了两种选择:找到一种方法将两个条件都放入同一个子句(wherehaving)或使用联合查询。

要在同一条款中同时考虑这两个条件,请考虑第二个条件为&#34;让我计算1920年之前发布的图书数量,并将任何人数保持在大于1&#34;。这是您可以转到having子句的条件。

其余逻辑只是将in替换为join。以下查询假定所有贷款在账面表中都有一个有效的isbn(否则使用left join):

select l.cardno, MIN(l.dateout)
from loan l left join
     book b
     on l.isbn = b.isbn
having MIN(l.dateout) <= date '2004-01-01' or
       sum(case when b.yearpublished < 1920 then 1 else 0 end) > 0
group by l.cardno
order by l.cardno asc;

请注意,我使用date构造替换了Oracle格式的日期常量。这允许您使用ISO标准日期格式。

答案 1 :(得分:0)

我得到了解决方案!感谢那个给我这个想法的人,我只是改变了一些东西并且欢呼它起作用!

select l.cardno, MIN(l.dateout)
from loan l left join
 book b
 on l.isbn = b.isbn
having MIN(l.dateout) < date '2004-01-03' or
   sum(case when b.yearpublished <= 1920 then 1 else 0 end) > 0
group by l.cardno
order by l.cardno asc;