2016-11-06 7 views
3

私はこれもsqlfiddle.comでこれを確認しましたが、postgresqlを使用しています。私は仕事に自然な結合を得ることができません

私のテーブルや要素は以下のとおりです。

create table Publisher(pID int PRIMARY KEY, name varchar(255), address varchar(255)); 
create table Book(ISBN int PRIMARY KEY, name varchar(255), genre varchar(255), price int, copies int, pID int REFERENCES Publisher(pID)); 
insert into Publisher values(1, 'Oxford University Press', 'Senkosova'); 
insert into Book values(111, 'Alamut', 'Horror', 50, 100, 1); 

私は自然ブックや出版社に参加し、オックスフォード大学出版局によって出版された本を手に入れたいです。

これは動作します:

select b.name 
from Book as b, Publisher as p 
where b.pid = p.pid and p.name ='Oxford University Press'; 

これはしていません:

select b.name 
from Book as b natural join Publisher as p 
where p.name = 'Oxford University Press'; 

は、これでもない:

select * 
from Book natural join Publisher; 

なぜ?

答えて

3

natural joinを使用しないでください。発生するのを待っているバグです。代わりに、明示的なonまたはusing句を使用します。

select b.name 
from Book b join 
    Publisher p 
    using (pid) 
where p.name = 'Oxford University Press'; 

か:

select b.name 
from Book b join 
    Publisher p 
    where b.pid = p.pid 
where p.name = 'Oxford University Press'; 

natural joinの問題は二つあります。まず、共通のという名前の比較用の列を、という名前で宣言された外部キー関係に基づいて作成します。どちらも、あなたのテーブルには、最低でもので、クエリに参加し、自然がに相当し、name列だけでなく、id列を持っている:

select b.name 
from Book b join 
    Publisher p 
    where b.pid = p.pid and b.name = p.name 
where p.name = 'Oxford University Press'; 

(そして、同じ名前を持つ他の列があるかもしれません。)私は疑いますどの本も「Oxford University Press」という名前が付けられているので、データに一致するものはありません。

2番目の問題は関連しています。結合に使用される列を明示的に含まないことによって、照会のリーダーはわかりません。そのため、クエリをデバッグして理解することが難しくなります。私の場合、私が作成するほとんどのテーブルはCreatedAtCreatedByのカラムを持っているので、natural joinは私のデータベースでは決して動作しません。

+0

包括的な回答をいただきありがとうございます。 – TugRulz

3

idnameの両方に、同じ名前の列が2つ以上あります。だから、

select * 
from book 
natural join publisher; 

は同等です

select * 
from book b 
join publisher p on b.pid = p.pid 
and b.name = p.name; 

パーthe documentation:

NATURALはUSINGの略記形式です。両方の入力テーブルに表示されるすべての列名から成る使用してリストを形成。 USINGと同様に、これらの列は出力表に1回だけ表示されます。共通の列名がない場合、NATURALはCROSS JOINのように動作します。

+0

ありがとうございます。分かりました。 – TugRulz

関連する問題