一个比较复杂的多表查询
现在我使用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