两个表中具有多个公共属性的自然连接[重复]

Posted

技术标签:

【中文标题】两个表中具有多个公共属性的自然连接[重复]【英文标题】:Natural join with more than one common attribute in two tables [duplicate] 【发布时间】:2014-12-08 17:46:26 【问题描述】:

当两个表只有一个共同属性时,我可以理解自然连接是如何工作的。如果他们有两个呢? 表1有3个属性:AB、C 表2有3个属性:AB、D

表 1 中的前两行:

1 2 3
4 5 6

表 2 中的前两行:

1 3 4
8 5 8

两个表之间自然连接的结果是什么?

【问题讨论】:

Natural Join 只是内部联接的简写,引擎可以从表元数据中自动构造联接子句。 6993 次观看,只有两个答案,但没有一个被接受,来帮忙吧? @PieterGeerkens 不,NATURAL JOIN 本身就是一种连接类型,并不像您描述的那么简单,例如它消除了为旧版(1992 年之前)目的而强制生成的最接近的等效 INNER JOIN 的重复列。 这能回答你的问题吗? Difference between natural join and inner join 【参考方案1】:

在您上面的两条记录的情况下,什么都不会匹​​配。它会寻找左表中的 A & B 匹配右表中的 A & B 的情况。

【讨论】:

@pln 不错。我以前没见过 SQL fiddle。【参考方案2】:

Natural JoinINNER JOIN 的变体,其中连接条件隐含在两个表的公共列上。在您的情况下,Natural Join 中的查询可以编写如下,它不会返回任何结果,因为它会尝试同时匹配 A 和 B

select *
from table1
natural join table2

同样可以写成Inner Join,如下所示

select t1.*
from table1 t1
inner join table2 t2
on t1.a = t2.a and t1.b = t2.b

自己看看Fiddle Demo

【讨论】:

You Fiddle 不是为我构建的,但从逻辑上讲,它们不能具有相同的结果,即第一个将包含 C 而第二个不会(除此之外:您的代码会因区分大小写而失败数据库,例如 A > a) ...但是无论如何将其转换为 INNER JOIN 有什么意义?! 自然连接不是内连接的变体。只有当没有共同的列时,它们才会返回相同的结果。自然连接返回每个公共列的 1 个副本,可以通过内部连接、合并和选择子句表示。【参考方案3】:

实际上 Natural Join 是某种东西(叉积 + 某些条件)

自然连接的缩写形式是:

Select * from Table_A NATURAL JOIN Table_B

所以,另一种写法是:

Select * from Table_A , Table_B where (Table_A.id = Table_B .id)

这相当于自然连接

(Table_A , Table_B) 表示叉积

(Table_A.id = Table_B .id) 表示共同条件

【讨论】:

内连接只返回每个公共列的一个副本。此外,连接表达式在 from 子句中有意义,而无需引用 select 子句。此外,这措辞也很糟糕,没有解释自然连接,示例不是来自问题,示例不相关。等等。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。但是,自然连接的工作原理多次重复;请不要回答重复的问题,将它们标记/投票为重复。【参考方案4】:

我正在为认证而学习,我也有这个疑问。 自然连接总是比较表中的相似列。 如果您有一对相似的列,它将进行比较并显示匹配项。机会更高。现在,如果你有 2 对,它会比较,它会带来更少的结果。内容必须相等。自己创建一个表并进行测试

【讨论】:

【参考方案5】:

我将尝试根据用例解释 NATURAL JOIN 和 INNER JOIN 之间的区别。

我们有两个表 T1(A, B, C, D) 和 T2(B, C, X, Y),其中字母表 (A, B, C, D, X, Y) 代表字段/属性。

案例 1:假设我必须在两个表中提取在“C”中具有共同条目的所有行。

查询:SELECT * FROM T1 INNER JOIN T2 ON T1.C=T2.C;

解释为什么 NATURAL JOIN 在上述情况下不起作用 --

假设我们使用 NATURAL JOIN。 从 T1 自然加入 T2 中选择 *; 我们知道,T1 和 T2 有两个相似的属性/字段('B' 和 'C') 因此,NATURAL JOIN 将查找所有此类条目,其中 (T1.B=T2.B) 与 (T1.C=T2.C) 只有满足上述条件的行才会包含在结果集中。 然而,为了我们的目的,我们只需要行在字段“C”中有一个共同的条目。

【讨论】:

如果有人正在寻找解决他们对内部连接和自然连接的疑问的答案,请在此处发表评论!我也在寻找在此过程中改进我的答案:)

以上是关于两个表中具有多个公共属性的自然连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 MySQL 中具有不同列的表的多个连接结果中删除重复项

mysql的多表连接

SQL 等值连接(内连接)自然连接(Out join,Left join,Right join)的区别

oracle连接总结(内连接外连接自然连接,交叉连接,自连接)

关系代数 - 笛卡尔积与自然连接?

SQL中的自然连接是啥意思啊?