必须在共享主键上进行自然连接吗?

时间:2017-10-03 22:54:03

标签: sql relational-database relational-algebra natural-join

假设我执行A自然连接B,其中:

A架构是:(aID),其中(aID)是主键 B&#39的架构是:(aID,bID),其中(aID,bID)是复合主键。

在这种情况下执行自然连接工作会是什么?或者A是否有必要同时使用aID和bID?

3 个答案:

答案 0 :(得分:1)

NATURAL JOIN返回每个公共输入表列名称只有一个副本的行,并且每个输入表都是唯一的列名称。它返回一个包含所有这些行的表,可以通过组合每个输入表中的一行来生成。这与有多少常见的列名无关,包括零。当没有常见的列名时,这是一种CROSS JOIN又名CARTESIAN JOIN。当所有列名都很常见时,这就是一种INTERSECTION。所有这些都与PK,UNIQUE,FKs&其他约束。

NATURAL JOIN作为关系代数运算符很重要。 In SQL it can be used in a certain style of relational programming that is in a certain sense simpler than usual.

对于真正的关系结果,您将选择SELECT DISTINCT。关系也没有特殊的NULL值,而SQL JOIN则将NULL视为不等于NULL;因此,如果我们将NULL视为另一个关系值,那么SQL有时不会返回真正的关系结果。 (当两个参数对于每个共享列都具有NULL并且两个共享列具有相同的非NULL值时。)

答案 1 :(得分:0)

“自然”联接使用列的名称来匹配表。它使用任何匹配的名称,无论密钥定义如何。

因此,

select . . .
from a natural join b

将使用AId,因为这是唯一具有相同名称的列。

在我看来,natural join是令人厌恶的。首先,它忽略了明确的声明的外键关系。这些是“自然连接”键,无论其名称如何。

其次,SELECT语句中的联接键不明确。这使得调试查询变得更加困难。

第三,我想不出一个SQL结构,其中添加列或从表中删除列需要工作查询并更改结果中的数量集。

此外,我的表格中经常有一些共同的列 - CreatedAtCreatedOnCreatedBy。只是这些列的存在排除了使用自然连接。

答案 2 :(得分:-1)

自然联接需要两者。

此致

泰德