Sql can';我不能自然地参加工作
我正在使用postgresql,不过我也在sqlfiddle.com上确认了这一点 我的表格和元素是: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
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的行为类似于交叉联接
非常感谢。我现在明白了。谢谢你全面的回答!