Sql can';我不能自然地参加工作

Sql can';我不能自然地参加工作,sql,database,postgresql,natural-join,Sql,Database,Postgresql,Natural Join,我正在使用postgresql,不过我也在sqlfiddle.com上确认了这一点 我的表格和元素是: 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 RE

我正在使用postgresql,不过我也在sqlfiddle.com上确认了这一点

我的表格和元素是:

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;
即使这样也不能:

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

为什么???

不要使用
自然连接,这是一个等待发生的错误。相反,在
上使用显式的
,或使用
子句使用:

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

自然连接的问题是双重的。首先,它将用于比较的列基于通用名称,甚至不基于声明的外键关系。两个表都有一个
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';
(可能还有其他专栏也有相同的名字。)我怀疑有哪本书被命名为“牛津大学出版社”,所以数据中没有匹配项


第二个问题是相关的。通过不显式包含用于联接的列,查询的读取器不知道。这使得查询更难调试和理解。在我的例子中,我创建的几乎所有表都有
CreatedAt
CreatedBy
列,因此
natural join
s无论如何都不会在我的数据库中工作。

两个表中都有多对同名列:
id
name
。所以

select *
from book 
natural join publisher;
相当于

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

NATURAL是一种使用的简写形式:它形成一个使用列表,由两个输入表中出现的所有列名组成。与使用时一样,这些列在输出表中只显示一次。如果没有通用列名,则NATURAL的行为类似于交叉联接


非常感谢。我现在明白了。谢谢你全面的回答!