2016-09-04 68 views
0

問題12.查找擁有或借用「978- 0262033848」這本書的副本的學生的姓名。使用UNION將聯盟更改爲或

select s.name 
from student s, loan l 
where s.email = l.borrower and l.book = '978-0262033848' 
union 
select s.name 
from student s, copy c 
where s.email = c.owner and c.book = '978-0262033848'; 

問題13找出誰擁有或借的書「978- 0262033848」的副本學生的名字。使用

我該怎麼做?

回答

0

你可以加入這三個表在一起,然後用一個OR條件WHERE條款中得到你想要的結果集:

SELECT DISTINCT s.name 
FROM student s 
LEFT JOIN loan l 
    ON s.email = l.borrower 
LEFT JOIN copy c 
    ON s.email = c.owner 
WHERE l.book = '978-0262033848' OR 
     c.book = '978-0262033848'; 

您還會注意到我代替你的隱加入與明確的左連接,將連接標準從WHERE移到ON條款。這是最佳實踐,因爲它使您的查詢更易於閱讀和維護。

更新:

我給你的是這樣做的首選方式查詢。如果你想堅持的預ANSI-92表格,您可以試試這個:

SELECT DISTINCT s.name 
FROM student s, loan l, copy c 
WHERE s.email = l.borrower OR 
     s.email = c.owner AND 
     (l.book = '978-0262033848' OR 
     c.book = '978-0262033848') 
+0

我們被告知不要使用內部連接。它仍然有可能嗎?我們只能使用從學生,複製c,貸款l等 我們可以使用關鍵字像IN,ALL,存在和除了 – RStyle

+0

@RStyle您原來的查詢_is_使用內部連接! –

+0

嗨,你能解釋一下這個部分嗎? s.email = l.borrower and s.email = c.owner 這是不是意味着我必須擁有並借用自己的書? 如果我擁有一本書但是我沒有借過任何書,會發生什麼。 – RStyle

0
select s.name 
from student s 
left join loan as l on s.email = l.borrower 
left join copy as c on s.email = c.owner 
where l.book = '978-0262033848' or c.book = '978-0262033848'