2016-09-24 14 views
0

私は以下の方法で2つのテーブルのアクティビティとパフォーマンスを定義しました。1対1の関係を選択

CREATE TABLE Activities (
ActivityID int NOT NULL, 
ActivityName char(30) NOT NULL default 'charity', 
PRIMARY KEY (ActivityID) 
); 



CREATE TABLE Performers (
    PerformerID int NOT NULL default '0', 
    PerformerName char(20) NOT NULL default '', 
    Street char(20) NOT NULL default '', 
    City char(15) NOT NULL default '', 
    State char(2) NOT NULL default '', 
    Zip int NOT NULL default '0', 
    ActivityID int default '0', 
    PRIMARY KEY (PerformerID), 
    FOREIGN KEY(ActivityID) REFERENCES Activities(ActivityID) ON DELETE NO ACTION ON UPDATE NO ACTION); 

各パフォーマーは特定のアクティビティを持っています。彼らがやっている活動と一緒にパフォーマーの名前を選ぶにはどうすればいいですか?

私はこれが正しいと思わ

SELECT performername,activityname FROM PERFORMERS NATURAL JOIN ACTIVITIES; 

を試してみました。いつもそうだろうか?

+0

@samurdhilibk自然結合が機能しないか、自然結合が必要ない場合があります。 –

答えて

1

に参加インナーを使用することができます。それは起こるのを待っているバグです。 INNER JOINの推奨は良いです。

select p.performername, a.activityname 
from Performers p inner join 
    Activities a 
    on a.ActivityID = p.ActivityID; 

または::

select p.performername, a.activityname 
from Performers p inner join 
    Activities a 
    using (ActivityID); 

NATURAL JOINでの問題は何ですか?ここでは2つの方法ですか基本的には、共通キーは単にその名前によって識別されるという問題があります。 が2つのテーブル間での外部キーの関係であると認識されません。同じ名前の列のみを使用します。

同じ名前の列が追加される可能性があるため、これは悪化します。たとえば、両方のテーブルでnameという名前を呼び出したことがあります。 NATURAL JOINの場合はとなり、自動的にとなります。私がCreatedByCreatedAtという列で作成したほとんどすべてのテーブル、NATURAL JOINは単に私のテーブルでは機能しません。

また、結合キーが明示的に指定されていないと、コードをデバッグするのがずっと難しくなります。つまり、USINGまたはONのいずれかであるためです。

+0

ありがとう@Gordon! 2番目のオプションは、外部キー宣言のためにのみ有効です。 @ samurdhilbk。 – samurdhilbk

+0

。 。 。いいえ、 'join 'のために外部キー宣言を自動的に使用する方法はありません。キーは明示的に指定されているため、どちらも機能します。キーが両方のテーブルで同じ名前を持つので、 'using'句が機能します。 –

2

あなたはNATURAL JOINを使用しないでください

select a.performername, b.activityname 
from Performers as a 
inner join Activities as b on a.ActivityID = b.ActivityID