2017-01-30 4 views
2

私は本当にJustLeeデータベースからのSQLの質問に固執しています。誰も私の宿題を探しているのではなく、残念ながら私は立ち往生しています...(+)演算子で伝統的な結合節を使用する

質問:彼らが書いたすべての著者と書籍を表示してください。まだ本を書いていない作家を含めてください。著者の姓、著者名、isbn、および書籍のタイトルを含めます。従来の結合節を(+)演算子とともに使用します。

私の最高の推測では、次のとおりです。

select lname, fname, isbn, title 
from author a, bookauthor ba, books b 
where a.authorid(+) = ba.authorid 
and ba.isbn(+) = b.isbn 
order by 1,2,3,4; 

しかし、私は列あいまいに定義されたエラーを取得します。どんな助けでも大歓迎です。ありがとう!

+0

あいまいな列はISBNです。とにかくそれを選択する必要があるのはなぜですか?それはちょうどコードです。あなたが本当に欲しいのはタイトルです。 – mathguy

+2

違反はありませんが、実際には別のチュートリアルが必要です。 2017年(または2016年)に古い、古い、独自の '(+)'外部結合を使用することを提案する人は、信用すべきではありません。また、オラクル社でもその構文の使用を中止することを推奨しているため、Oracleマニュアルを必ず読まなければなりません。 –

答えて

4

あなたはSELECTリストにあいまいな列名を修飾する必要があります。

select lname, fname, b.isbn, title 
from author a, bookauthor ba, books b 
where a.authorid(+) = ba.authorid 
and ba.isbn(+) = b.isbn 
order by 1,2,3,4; 

それは他に何も列がから来ているものを表にそれを明確にしないよりも、場合、選択中のすべての列を修飾することが一般的に良い練習です。私はまた、あなたが現代JOIN構文に切り替え、そしてORDER句で明示的にカラムを列挙することをお勧め:

あなたが選択している列の
select a.lname, a.fname, b.isbn, b.title 
from author a 
LEFT JOIN bookauthor ba 
ON a.authorid = ba.authorid 
LEFT JOIN books b 
and ba.isbn = b.isbn 
order by a.lname, a.fname, b.isbn, b.title; 
+0

これは感謝しています!私は今、選択するISBNを区別しなければならないことを理解しています。また、私は左への参加について教えられていないが、教科書でそれについて読む予定である。 – DNkG

+0

親愛なる - 「左外部結合」のOracle表記法では、WHERE句の等価の右辺に(+)があります。 'bookauthor'と' book'の間の結合のためにLEFT結合を行う理由はありません。 – mathguy

+0

@mathguyありがとう、固定。 –

0

1つ以上は、複数のテーブルに存在します。あなたはそれらを修飾しなければなりません。 isbn列がbooksbookauthorテーブルの両方に存在し、その代わりにisbnを選択するので、あなたがb.isbnba.isbnを選択する必要がありますように

が見えます。

1

データモデルが正しい場合、authoridauthorのプライマリキーで、外部キーはbookauthorである必要があります。同様に、isbnは、booksの外部キーとbookauthorの外部キーである必要があります。あなたは主に著者の質問をしています。おそらく、書籍を書いていない作家がいるかもしれないので、authorのテーブルにありますが、bookauthorのテーブルには入っていない可能性があります。 authorテーブル)問題の声明は、「彼らは彼らの本を書くことを終わらせていない」と述べている。

authorテーブルにのみ表示されますが、bookauthorに、あなたはauthorbookauthorleft outer joinを必要としない著者を取得します。 、(+)であり、左の場合

が参加:

... from author a, bookauthor ba, books b 
where a.authorid = ba.authorid(+) 
    and ba.isbn = b.isbn 

お知らせ二つのこと:Oracle独自の表記法((+)表記)を使用して、(+)は平等の右側側にする必要があります権利。これを覚えておいてください:外側の結合は、左側のテーブルにあるauthoridの値の "架空の"行を作成しますが、右側の行には欠けています。右のテーブル(左ではありません)にこれらの "メイクアップ"または "架空の"行を追加する必要があります。したがって、(+)は右側にあります。

isbnの場合は、内部結合で十分です。booksテーブルのブックに対応していないブックがbookauthorテーブルに存在しないようにしてください。 (テーブルが上記のような適切な外部キーとプライマリキーを持っているのではないでしょうか?)

ノート:私は古典的な非推奨の(+)構文を学ばなければならない本を疑っていますより一般的には、ON句またはUSING句を使用する現代的なANSI標準構文とは対照的に、「WHERE句の条件を使用して構文を結合する」)。

関連する問題