AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 190662
Accepted
Justin
Justin
Asked: 2017-11-11 15:10:25 +0800 CST2017-11-11 15:10:25 +0800 CST 2017-11-11 15:10:25 +0800 CST

联接如何进行交换和关联?

  • 772

我已经阅读了所有连接是关联和交换的地方。

所以A join (B join C)应该是一样的(A join C) join B。

但我真的很难理解这是怎么回事。假设 A 和 B 有一个共同的属性,B 和 C 有一个共同的属性,但是 A 和 C 没有共同的属性来连接。

似乎在那种情况下,在第二种情况下(A join C) join B,当连接 A 和 C 的操作发生时,它会导致一个空集,从而使与 B 的连接成为不可能。

而在第一种情况下,它会起作用,因为 B 连接 C 会导致预期的连接表具有与 A 连接的属性。

relational-theory relational-algebra
  • 2 2 个回答
  • 8560 Views

2 个回答

  • Voted
  1. Best Answer
    RDFozz
    2017-11-11T18:20:26+08:002017-11-11T18:20:26+08:00

    你做了一个错误的假设。

    如果三是 and 之间的关系,and 之间A和and但没有关系and ,加入and不会给你任何行。它实际上为您提供m * n行,其中m是 中的行数,n是 中的行数。BBCACACAB

    A JOIN B on (a.id = b.A_id)
      JOIN C on (b.id = c.B_id)
    

    变成,如果我们加入A并且C首先:

    A JOIN C on (1 = 1)
      JOIN B on (a.id = b.A_id AND b.id = c.B_id)
    

    注意:大学是 30 多年前的 - 希望您从概念上理解,并且可以重写为实际关系代数的正确语法。

    如果您有 20 行 in A、 30 inB和 40 in C,并且 in 的每一行B匹配 1 中的一行且仅匹配 1 行A,并且 in 的每一行C匹配 中的 1 行且仅匹配 1 行B。当您加入A时B,您将获得 30 行;当您将这 30 行加入 时C,您将获得 40 行。

    如果您第一次加入A,C与定义哪些行对是有效的没有关系,您将获得每对可能的行- 800 行。当我们加入800 行时,和B之间的连接意味着其中的一行只能匹配包含一个特定行的行 - 其中将有 40 个(每行一个)。在这 40 个中,唯一的实际匹配是 和 之间的连接也是有效的。而且,我们知道匹配当前行的行不能匹配任何其他行。所以,对于一排,我们可能有 2BABACACBCCBBBAC匹配的行,另外 4 行,再匹配 1 行。

    也就是说,我们知道每一C行都匹配一个(并且只有一个)B行,所以匹配的总数将再次达到 40 - 与我们第一次匹配的 40 个匹配Aand B, or Band相同C。

    所以 - 连接的条件并没有告诉你哪些行匹配 - 它真的告诉你哪些行不匹配。把它拿走,你就得到了- 两个表中行的叉积。CROSS JOIN

    • 5
  2. Maha
    2018-05-12T23:41:39+08:002018-05-12T23:41:39+08:00

    考虑到

    • A、B、C是三张表
    • 连接操作用⋈表示
    • 集合(下面维恩图中的圆圈)是根据连接列形成的,即 A ⋈ B 表示对于 A 和 B 的连接列具有相同值的行集

    join的结合性可以用维恩图直观地证明如下:

    在此处输入图像描述

    用维恩图可以直观地证明join的交换性如下:

    在此处输入图像描述

    更新
    (之前,图表有∩而不是⋈。下面的解释是在∩的上下文中进行的。)

    感谢@Lennart 在评论中指出

    “A 连接 B”与“A 相交 B”不同

    我想需要提供更多解释,因为INTERSECT操作与INNER JOIN. 我想从链接中强调以下几点:

    1. INTERSECTINNER JOIN运算符多次返回与子句几乎相同的结果。
    2. 使用INTERSECT运算符时,所有查询中的列数和顺序必须相同,并且数据类型必须兼容。但是,如果考虑我在上面第三个要点中明确表示的内容,这对上面的维恩图没有影响:

      A ∩ B 表示 A 和 B 的连接列具有相同值的行集

      所以 ∩ 符号我真正的意思是加入,而不是相交,考虑到这一点,加入将遵循集合交集的行为。我想我犯的错误是使用符号∩而不是⋈。写答案时我没有考虑INTERSECT手术。我出于直觉将其用作“两组的逻辑交集”,而不是“数据库INTERSECT操作”。

    3. INNER JOININTERSECT与 一起使用时可以模拟with DISTINCT。但即使我们不包含DISTINCT并保留它INNER JOIN,维恩图仍然成立,因为两个圆/集的交集也会包含重复记录。

    另请注意,此答案试图使用与维恩图类似的方法来解释左外连接的关联性。

    最后,老实说,我觉得我应该把符号∩换成⋈。

    • 1

相关问题

  • 如何设计变量数据的关系?

  • “hasMany”属于哪个范围?

  • 关系设计 - 一个外键列中的多个表?

  • 命名表和视图时应该遵循什么标准?

  • 如何构建模型以正确有效地表示关系数据库上的树状数据?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve