2016-09-04 38 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'