两个表中具有多个公共属性的自然连接[重复]
Posted
技术标签:
【中文标题】两个表中具有多个公共属性的自然连接[重复]【英文标题】:Natural join with more than one common attribute in two tables [duplicate] 【发布时间】:2014-12-08 17:46:26 【问题描述】:当两个表只有一个共同属性时,我可以理解自然连接是如何工作的。如果他们有两个呢? 表1有3个属性:A、B、C 表2有3个属性:A、B、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 Join
是INNER 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”中有一个共同的条目。
【讨论】:
如果有人正在寻找解决他们对内部连接和自然连接的疑问的答案,请在此处发表评论!我也在寻找在此过程中改进我的答案:)以上是关于两个表中具有多个公共属性的自然连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQL 等值连接(内连接)自然连接(Out join,Left join,Right join)的区别