2016-09-04 1 views
0

質問12.本「978- 0262033848」のコピーを所有または借りた学生の名前を検索します。 UNIONを使用してください。ユニオンをORに変更する

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

あなたは一緒にこれらの3つのテーブルを結合して、ご希望の結果セットを取得するためにWHERE句でOR条件を使用することができます:あなたはまた、私は明示的な左が参加して、あなたの暗黙の加入置き換えられていることがわかります

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、exists、exceptのようなキーワードを使用できます – RStyle

+0

@RStyle元のクエリは内部結合を使用しています! –

+0

こんにちは、この部分を説明できますか? s.email = l.borrowerと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' 
関連する問題