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

一个比较复杂的多表查询
现在我使用C#编一个图书管理系统,后台数据库采用Oracle10g。数据库的各表简要如下:

图书信息表:BookInfo
BookID
BookName         --书名

杂志信息表:MagazineInfo
MagaID
MagaName         --杂志名

用户信息表:UserInfo
UserID
UserName     --用户名

图书借阅纪录表:BookBorrowInfo
BookBorrowID
Borrow_BookID       --所借的书的ID号
Borrow_UserID       --借出用户的ID号
Borrow_Date           --借出日期
Return_Date           --归还日期

杂志借阅记录表:MagaBorrowInfo
MagaBorrowID
Borrow_MagaID       --所借的杂志的ID号
Borrow_UserID       --借出用户的ID号
Borrow_Date           --借出日期
Return_Date           --归还日期

现在我遇到一个比较复杂的多表查询的问题:就是我要查一个用户的所有借阅纪录(无论是借图书还是借杂志的),查询结果集只包含三个字段:所借的图书或杂志名,借出日期,归还日期。于是我写了一条查询语句(这里我指定用户id为1,表空间为intel)

select   BookName,MagaName,BookInfo.Borrow_Date,BookInfo.Return_Date,MagaBorrowInfo.Borrow_Date,MagaBorrowInfo.Return_Date   from   intel.BookInfo,intel.MagazineInfo,intel.BookBorrowInfo,intel.MagaBorrowInfo   where   (intel.BookInfo.BookID   =   intel.BookBorrowInfo.Borrow_BookID   and  
intel.BookInfo.Borrow_UserID=1)   OR   (intel.MagazineInfo.MagaID=   intel.MagaBorrowInfo.Borrow_MagaID   and  
intel.MagaBorrowInfo.Borrow_UserID=1);

    我把这个查询语句放在SQL*PLUS上运行,错误是:未选选定行。这个查询语句到底该怎么写呢?

------解决方案--------------------
select magName,Borrow_Date,Return_Date
from MagazineInfo inner join MagaBorrowInfo on Borrow_MagaID=MagaID
where Borrow_UserID=1
union
select BookName,Borrow_Date,Return_Date
from BookBorrowInfo inner join BookBorrowInfo on Borrow_BookID=BookID
where Borrow_UserID=1

------解决方案--------------------
select a.UserName,t1.BookName,t1.Borrow_Date,t1.Return_Date,
t2.MagaName,t2.Borrow_Date,t2.Return_Date
from intel.UserInfo a,
(select * from intel.BookBorrowInfo b,intel.BookInfo c
where b.Borrow_BookID=c.BookID) t1,
(select * from intel.MagaBorrowInfo d,intel.MagazineInfo e
where d.Borrow_magaID=e.MagaID ) t2
where a.UserId=t1.Borrow_UserID(+) and a.UserID=t2.Borrow_UserID(+)
去掉圖書和雜志者為空的記錄
------解决方案--------------------
select bookname v_name, b.borrow_date v_sdate,b.return_date v_rdate
from BookBorrowInfo b,UserInfo,BookInfo where userid=b.Borrow_UserID and BookID=b.Borrow_BookID
union
select MagaName v_name, a.Borrow_Date v_sdate,a.Return_Date v_rdate
from MagaBorrowInfo a,UserInfo,MagazineInfo where userid=a.Borrow_UserID and MagaID=Borrow_MagaID
------解决方案--------------------
select 'BOOK ', bi.BookName, bb.Borrow_Date, bb.Return_Date
from intel.BookInfo bi, intel.BookBorrowInfo bb
where bi.BookID = bb.Borrow_BookID
and bb.Borrow_UserID = 1
union
select 'Magazine ', mi.BookName, mb.Borrow_Date, mb.Return_Date
from intel.MagazineInfo mi, intel.MagaBorrowInfo mb
where mi.BookID = mb.Borrow_BookID
and mb.Borrow_UserID = 1