内连接sql的相关性和可交换性

时间:2014-11-08 07:40:45

标签: postgresql inner-join associativity commutativity

让我们说我有这个架构。

Boats
_____
bid
bname

Reserves
________
sid
bid
date

Sailors
_______
sid
sname

我知道内连接应该是关联的和可交换的,但我不能理解为什么。

鉴于查询:

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves

我认为这应该返回null,因为水手和船没有共同的领域,而:

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Reserves) NATURAL INNER JOIN Boats

应该返回水手的名字和他们保留的船名。

请告诉我为什么内连接应该是可交换的和关联的。

谢谢!

1 个答案:

答案 0 :(得分:0)

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves
  

我认为这应该从水手和船只返回null   没有共同的领域。 。

在PostgreSQL中,没有公共列的两个表之间的natural join表现得像交叉连接。

create table boats (
  bid integer primary key,
  bname varchar(15)
);

create table sailors (
  sid integer primary key,
  sname varchar(15) 
);

insert into boats values (1, 'One'), (2, 'Two'), (3, 'Three');
insert into sailors values (1, 'One'), (2, 'Two'), (3, 'Three');

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Boats);
sname    bname
--
One      One
One      Two
One      Three
Two      One
Two      Two
Two      Three
Three    One
Three    Two
Three    Three