您好,我需要一些初学者的帮助,找到所有贷款借款人的借款人最早贷款的卡号和日期 在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;
答案 0 :(得分:1)
这是一个有趣的问题,有点棘手。您的方法有两个条件,但必须满足这两个条件,并且问题要求or
。这为您提供了两种选择:找到一种方法将两个条件都放入同一个子句(where
或having
)或使用联合查询。
要在同一条款中同时考虑这两个条件,请考虑第二个条件为&#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;