1

所以我对 SQL 相当陌生,目前我坚持使用 Natural Join 的概念。

目前,我了解 Natural Join 运算符通过匹配具有相同名称的所有列并丢弃重复列和丢弃​​不匹配的行来连接表。

所以最近我遇到了一个问题,真的很基本,但是我无法理解它。

所以有 2 个关系 R(A,B,C) 和 S(A,B,D)

    A B C           A B D
    6 8 7           5 8 7
    6 6 7           6 6 7
    7 8 6           6 8 6

以下查询将产生多少行?

从 R 自然连接中选择 *

因此,我立即看到两列“匹配”它们是 A 和 B。通过使用 Natural Join,它会同时考虑 A 和 B 还是只考虑 A,因此会丢弃哪些信息。

答案是 2 行。有人可以解释一下获得 2 行的方法吗?

谢谢!

2行是否有任何机会

    A B D
    6 6 7
    6 6 6

如果是这样,我可以删除这个问题

4

2 回答 2

3

不要使用自然连接。不要费心学习自然连接。他们是可憎的。

为什么?连接条件基于具有相同名称的列。自然连接甚至不考虑声明的外键关系。这可能非常危险。或者 - 在我的情况下 - 因为几乎我所有的表都有CreatedAtand CreatedBy,它们无论如何都没用。

相反,列出join键。在您的情况下(因为您有select *),该using子句最合适:

SELECT * 
FROM R JOIN
     S
     USING (A, B);

这也有一个优点,即在查询中显式显示键,这大大减少了错误的范围。

于 2018-01-02T02:23:51.823 回答
0

冒着过度简化的风险,NATURAL JOIN对同名的列执行连接。

这是使用更多类型化运算符的重写(在许多其他可能的重写中):

SELECT R.A, R.B, C, D
  FROM R, S
 WHERE R.A = S.A
       AND R.B = S.B

结果有四列和两行:

| A | B | C | D |
-----------------
| 6 | 6 | 7 | 7 |
| 6 | 8 | 7 | 6 |
于 2018-01-12T16:12:32.463 回答