日期:2014-05-17  浏览次数:20794 次

一个比较复杂的层次查询
现在oracle数据库有4个表。
用户信息表T_UserInfo,字段如下:
userid     --用户id
user_BorrowPermission       --用户的预借权限,是预借权限表的id的外键

预借权限表T_PreBorrowPermission,字段如下:

PreBorrowPermissionID       --ID值
PreBorrowTime                       --预借有效期

预借信息表T_PreBorrowInfo,字段如下:
ID         --信息id
userID       --用户ID(即预借人id)
PreBorrowDate     --预借日期
BookID     --所借的图书的id

图书信息表T_BookInfo,字段如下:
BookID  
BookName     --图书名称

      现在我要查询哪些还没有过预借有效期的图书名称,其中一个查询条件是肯定是
trunc(sysdate)-   trunc(to_date(PreborrowDate))   between   0   and   预借有效期。
但是预借有效期是比较复杂,首先查询预借信息表,获取用户id,然后根据用户id查询用户信息表它的预借权限id,再根据预借权限id查询预借权限表才能查到预借有效期,查到的预借有效期还要嵌进上面的条件。到底应该怎么做呢?




------解决方案--------------------
create or replace view temp
as
SELECT a.bookid,a.bookname,c.userid,d.preborrowpermissionid,(trunc(sysdate)-trunc(b.preborrowdate)) d,
d.preborrowtime E
FROM T_BOOKINFO a
left join t_preborrowinfo b
on a.bookid=b.bookid
left join t_userinfo c
on b.userid=c.userid
left join t_preborrowpermission d
on c.user_borrowpermission=d.preborrowpermissionid
select t.* from temp t where t.d <t.E