如何使用join最小化多个子查询?

时间:2014-02-28 09:39:01

标签: sql optimization subquery

任何人都可以提出更好的解决方案吗?

SELECT TITLE,BOR_NAME,BOR_ADDRESS FROM BOOK,BORROWER 
WHERE BOOKID IN 
     (SELECT BOOKID 
      FROM BOOK_LOANS 
      WHERE BRANCHID IN 
            (SELECT BRANCHID 
             FROM LIBRARY_BRANCH 
             WHERE BRANCH_NAME='SHARPSTOWN'))
      AND CARDNO IN 
          (SELECT CARDNO 
           FROM BOOK_LOANS 
           WHERE DUEDATE=to_date(sysdate));

任何帮助?

3 个答案:

答案 0 :(得分:0)

您可以使用JOIN

将子选择包含在FROM部分中

e.g。这样

SELECT TITLE,BOR_NAME,BOR_ADDRESS 
FROM 
BOOK JOIN BOOK_LOANS ON BOOK.CARDNO =BOOK_LOANS.CARDNO AND BOOK_LOANS.DUEDATE=to_date(sysdate)
,BORROWER 
WHERE BOOKID IN (SELECT BOOKID FROM BOOK_LOANS WHERE BRANCHID IN (SELECT BRANCHID FROM LIBRARY_BRANCH WHERE BRANCH_NAME='SHARPSTOWN'))
;

与另一个更大的子选择同样的事情

答案 1 :(得分:0)

你可以写成:

SELECT BK.TITLE,
       BRR.BOR_NAME,
       BRR.BOR_ADDRESS
FROM BORROWER BRR
left join BOOK_LOANS BL on BL.CARDNO = BRR.CARDNO
left join BOOK BK on BK.BOOKID = BL.BOOKID
left join LIBRARY_BRANCH LB on LB.BRANCHID = BL.BRANCHID
where BL.DUEDATE = to_date(sysdate)
and LB.BRANCH_NAME='SHARPSTOWN';

答案 2 :(得分:0)

select b.title, bor.bor_name, bor.bor_address
from  book b,
      borrower bor,
      book_loans bl,
      library_banch lib,
where b.book_id       = bl.book_id
and   b.cardno        = bor.cardno 
and   bl.branch_id    = lib.branch_id
and   lib.branch_name ='SHARPSTOWN'   
and   bl.duedate = to_date(sysdate);
相关问题