2016-04-30 11 views
0

私はSQLの本を読んでいますが、私は下の画像に示すように、データベーススキーマに関連する例に固執しています。本の中で述べたように、以下のTHE DATABASE SCHEMANATURAL JOIN SQLと組み合わせてWHERE句を使用しますか?

の例では、クエリを解決します

「彼らが教えるコースのタイトルと一緒にインストラクター の名前の一覧を表示します。」クエリができ、我々は、クエリに答えることを望むと仮定します次のように SQLで書かれた:

select name , title 
from instructor natural join teaches , course 
where teaches.course id = course.course id; 

今本は

は「どこCLにそのteaches.courseのID に注意してくださいと述べていますこのフィールドは教示関係から来ているので、自然結合結果のコースIDフィールドを参照する。自然の中での属性を参照するために、インスタンスinstructor.nameまたはteaches.course IDの、オリジナルの関係名を含む属性名を使用することはできません:「

があること

BOLDで再びブック状態」結果に参加する。しかし、関係名なしで 名前やコースIDなどの属性名を使用することができます。 "

(上記のクエリを参照してください)それができない場合、著者はどのようにしてクエリを書くことができましたか?

teaches.course id = course.course id 

ナチュラル・ジョイン属性「コース」を参照してくださいteaches.courseするにはどうすればよい、著者はそのあいまい彼arguments.Pleaseは私のビューの著者のポイントを説明し出すました。

+0

SQL Serverは 'NATURAL JOIN'をサポートしていないため、そのデータベースに関する質問はできません。 –

+0

質問は、SQLサーバーについてではなく、SQL言語に関する一般的な質問です。私はちょうど追加のタグとしてそれを使用しています。 –

+2

'講師からの自然な参加が教える、コース'私は言うだろう:本を燃やす! '自然な結合 'は一般的に悪と見なされ、古いスタイルのカンマリスとの組み合わせでは認識できません。 – wildplasser

答えて

5

は本が持っているものを無視しますつまり、約NATURAL JOINです。ただそれを避けてください。NATURAL JOINは、起こるのを待っているバグです。彼が参加するキーは、テーブル内の列の命名規則によって定義されます。同じ名前を持つ列が使用されます。実際には、NATURAL JOINは、が正しく定義されています。FOREIGN KEYの関係は無視されます。マッチングに実際に使用されるキーを隠します。

したがって、代わりにONまたはUSING句を明示的に使用してください。これらは使用されているキーが明示されており、コードは理解しやすく保守しやすいものです。

次に、簡単な規則に従います。FROM句にカンマを使用します。 常に明示的なJOIN構文を使用してください。そこにはwhere句がなく、すべての列が、彼らがどこから来ているテーブルを指定することを意味し、修飾されていることを

select i.name, c.title 
from instructor i inner join 
    teaches t 
    on t.instructor_id = i.instructor_id inner join 
    course c 
    on t.course_id = i.course_id; 

注:

だから、あなたのクエリを書くための良い方法は、このようなものになるだろう。

また、teachesテーブルにはinstructor_idという列はありません。したがって、これは合理的なコードの例です。

+0

ありがとうございました –

関連する問題