右全外连接查询

Ank*_*iya 5 join database-theory

我遇到了 1 个查询,它是

Select * from R Natural Outer Join S
Run Code Online (Sandbox Code Playgroud)

哪里R=(A,B)有元组{(1,2),(1,2),(3,4)}S=(B,C)有元组{(2,5),(2,5),(4,6),(7,10)}

为了实现这一点,我创建了 2 个名为R和 的关系S

create table R
(
A number(5),
B number(5)
)

create table S
(
B number(5),
C number(5)
)
Run Code Online (Sandbox Code Playgroud)

我在其中插入了提供的元组。

现在在实现这个时,我开始知道我使用的数据库工具(Oracle)不支持“自然外连接”,所以我使用了以下查询

select *
from R
natural full outer join S
Run Code Online (Sandbox Code Playgroud)

输出

2 1 5
2 1 5
2 1 5
2 1 5
4 3 6
7   10
Run Code Online (Sandbox Code Playgroud)

现在来回答我的问题

  1. “自然外连接”与“自然全外连接”相同吗?
  2. 这里的记录匹配是如何进行的?

因为在任何表中都没有定义主键,所以我认为它应该进行交叉连接并显示 16 条记录,但事实并非如此。

如果有人可以向我解释这种行为,那将非常有帮助。

gbn*_*gbn 6

维基百科上的快速检查没有提到当这个重要的位被省略时“外连接”是否意味着左、右或完整。

几乎,

  • 不支持自己的“外部连接”。您通常需要 LEFT、RIGHT 或 FULL
  • “自然”的意思是“加入同名列”

这意味着

  • 无法识别“自然外连接”
  • “自然全外连接”是具有“自然”匹配的“全外连接”

在这种情况下,索引/键无关紧要,没有区别。

您得到的结果符合标准

select *
from 
   R
   full outer join 
   S ON R.B = S.B
Run Code Online (Sandbox Code Playgroud)

或者

select *
from 
   R
   full outer join 
   S USING (B)
Run Code Online (Sandbox Code Playgroud)

注意:并非所有 RDBMS 都支持所有语法:

  • SQL Server不支持自然科学(一个东西)
  • MySQL 不支持 FULL OUTER JOIN(可以解决)

自然连接无论如何都是危险的(SO 链接)

  • +1 表示答案的第一部分,-1 表示附加通常的“被认为有害的自然连接”废话。我的回应应该是什么?在评论中发出通常的“自然连接很好而且很花哨”的反驳意见?发布我自己的答案,复制答案的第一部分并附加通常的“自然连接很好,很花哨”的反驳? (3认同)
  • @onedaywhen:嘿嘿嘿。我知道这会激怒你 :) 现实世界不能容忍 NATURAL JOIN,尤其是当 OO 开发人员想要在每个表中使用“ID”列时 阅读 http://programmers.stackexchange.com/ 上的评论和答案很有趣q/114728/5905 特别是来自“吉姆”。我上面的中间链接引用了 [Bill Karwin](http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557) (2认同)