假设我执行 A 自然连接 B,其中:
A 的架构是:(aID),其中 (aID) 是主键。
B 的架构是:(aID,bID),其中 (aID,bID) 是复合主键。
在这种情况下执行自然连接工作吗?或者 A 是否需要同时拥有 aID 和 bID 才能正常工作?
假设我执行 A 自然连接 B,其中:
A 的架构是:(aID),其中 (aID) 是主键。
B 的架构是:(aID,bID),其中 (aID,bID) 是复合主键。
在这种情况下执行自然连接工作吗?或者 A 是否需要同时拥有 aID 和 bID 才能正常工作?
NATURAL JOIN 返回行,其中每个公共输入表列名的副本和输入表唯一的每个列名的副本。它返回一个包含所有此类行的表,这些行可以通过组合每个输入表中的一行来创建。这与有多少常见的列名无关,包括零。当没有通用列名时,这是一种 CROSS JOIN aka CARTESIAN JOIN。当所有列名都是通用的时,这是一种 INTERSECTION。所有这一切都与 PK、UNIQUE、FK 和其他约束无关。
NATURAL JOIN 作为关系代数运算符很重要。在 SQL 中,它可以用于某种风格的关系编程中,这种风格在某种意义上比通常更简单。
对于真正的关系结果,您将选择 DISTINCT。关系也没有特殊的 NULL 值,而 SQL JOIN 将 NULL 视为不等于 NULL;因此,如果我们将 NULL 视为关系上的另一个值,那么 SQL 有时不会返回真正的关系结果。(当两个参数对于某些共享列中的每一个都具有 NULL 并且对于彼此的共享列都具有相同的非 NULL 值时。)
“自然”连接使用列名在表之间进行匹配。它使用任何匹配的名称,而不管键定义如何。
因此,
select . . .
from a natural join b
将使用AId
, 因为这是唯一具有相同名称的列。
在我看来,natural join
是可憎的。一方面,它忽略了明确声明的外键关系。这些是“自然连接”键,无论它们的名称如何。
SELECT
其次,语句中的连接键不明确。这使得调试查询更加困难。
第三,我想不出一个 SQL 构造,其中添加列或从表中删除列需要一个工作查询并更改结果集中的行数。
此外,我的桌子上经常有公共列—— CreatedAt
、、、。只是这些列的存在排除了使用自然连接。CreatedOn
CreatedBy
自然连接将需要两者。
问候,
泰德