Oracle语法左连接三个或更多表

2023-12-03

我正在尝试了解旧的 Oracle Left Join 语法。 有两个表就可以了:

FROM A, B
WHERE
A.Col = B.Col (+)

(我们将此查询称为 Q0)

这很容易理解,例如和这个维恩diagram

但是,当我们添加第三个或更多表时,我的大脑就想关闭:

FROM A,B,C
WHERE 
A.C = B.C (+) AND
C.C = A.C (+)

(我们称之为 Q1)

它应该等于:(我刚刚更改了左侧连接条件的位置)

FROM A,B,C
WHERE 
C.C = A.C (+) AND
A.C = B.C (+)

(我们称之为 Q2)

这是我对这些问题的看法,我的问题是我是否理解正确:

据我了解,解释两个以上表的左连接的一种方法是将其视为左连接链,其中一个是另一个的输入,它是否正确?

因此,在 Q1 中,我们有两个左连接,第一个是 A 与 B 的左连接,其中 A 是左表。第二个左连接对我来说开始变得棘手。起初我以为是表 C 与表 A 左连接,其中 C 是左表。但这似乎是不正确的,而应该将其视为 C 左连接与第一个左连接的结果,其中 C 是左表。它是否正确?

但是我如何在第二季度应用这个“链原理”呢?

我尝试复制 Q1 中的推理:第一个连接是 C 与 A 左连接,其中 C 是左表。第二个联接是 A 与第一个联接的结果之间的左联接,其中 A 是左表。但这没有意义,第二个左连接的连接条件是在A列和B列之间,而第一个左连接的结果中没有B列。

出于好奇+,我尝试在第二个连接中切换左表和右表,即第一个连接的结果将充当第二个左连接中的左表,与 B 左连接。看起来这有效,结果变得与 Q1 相同。但我不知道如何解释为什么会这样。

因此,如果有人能建议一种在使用 oracle 语法时通用适用于三个或更多表的推理方法,我们将不胜感激。 如果这样的通用方法包含将 oracle 语法转换为 ANSI 语法的通用方法,也可以,因为我可以更容易地理解这一点。


你可以以级联的方式看到它。但是,关键是查找在同一查询中左连接和右连接的那些表。在这种情况下,顺序不同:首先应用表右连接的条件。我希望下图能够阐明这一点:

enter image description here

您还可以通过查看查询的执行计划来检查这些连接的顺序:

For Q1:

select a.c a, b.c b, c.c c   from a, b, c  where a.c = b.c (+)    and
c.c = a.c (+)

------------------------------------------------------------------------
| Id  | Operation           | Name | E-Rows |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |        |       |       |          |
|*  1 |  HASH JOIN OUTER    |      |      4 |  2168K|  2168K|  805K (0)|
|*  2 |   HASH JOIN OUTER   |      |      4 |  2616K|  2616K|  981K (0)|
|   3 |    TABLE ACCESS FULL| C    |      4 |       |       |          |
|   4 |    TABLE ACCESS FULL| A    |      4 |       |       |          |
|   5 |   TABLE ACCESS FULL | B    |      4 |       |       |          |
------------------------------------------------------------------------

For Q2:

select a.c a, b.c b, c.c c   from a, b, c  where c.c = a.c (+)    and
a.c = b.c (+)

------------------------------------------------------------------------
| Id  | Operation           | Name | E-Rows |  OMem |  1Mem | Used-Mem |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |        |       |       |          |
|*  1 |  HASH JOIN OUTER    |      |      4 |  2168K|  2168K|  801K (0)|
|*  2 |   HASH JOIN OUTER   |      |      4 |  2616K|  2616K|  983K (0)|
|   3 |    TABLE ACCESS FULL| C    |      4 |       |       |          |
|   4 |    TABLE ACCESS FULL| A    |      4 |       |       |          |
|   5 |   TABLE ACCESS FULL | B    |      4 |       |       |          |
------------------------------------------------------------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle语法左连接三个或更多表 的相关文章

随机推荐

  • 使用 c# mvc4 读取 rss feed

    这是我的第一篇文章 所以我遇到了这个问题 而且我对这种语言或 c 非常陌生 我有一个读取新闻 rss 的模型 然后使用相同的索引控制器 我必须将其传递给视图 这是我的模型 using System using System Collecti
  • Three.js Raycaster 不与自定义网格相交

    我通过创建带有顶点的几何图形 然后构建面来构建自定义网格 八角棱柱 我现在尝试添加鼠标悬停交互 但是 Raycaster 没有返回该网格的交集 我认为这是网格的问题 因为其他几何图形在场景中的相交处正确返回 完整的例子可以在这里看到 htt
  • java.lang.ClassNotFoundException: org.dom4j.DocumentException

    我编写了一些代码来学习hibernate 它抛出下面的错误 我如何找出问题所在并解决它 dom4j 听起来像是一个 XML 问题 是hibernate cfg xml的问题吗 Exception in thread main java la
  • 我实际上可以在cuda卡上分配多少内存

    我正在编写一个使用 cuda 在 GPU 上执行计算的服务器进程 我想对传入请求进行排队 直到设备上有足够的内存来运行作业 但我很难计算出可以在设备上分配多少内存 我对作业需要多少内存有一个很好的估计 至少从 cudaMalloc 分配多少
  • 如何使用 VS2015 远程运行测试?

    我有一些 CodedUI 测试 我想在 Visual Studio 的远程计算机上运行 现在 过去您需要在某处安装一个测试控制器 在要运行的盒子上安装一个测试代理 让它们说话 然后使用指向该控制器的测试设置文件 我正在经历这个并在我的运行箱
  • 当应用程序处于工作模式时,UILocalNotification 不会触发

    关于为什么本地通知无法正常触发有很多问题here and there 还有几个关于为什么当应用程序处于后台状态时本地通知不会触发的问题 我也经历过them 但令我惊讶的是 我没有找到任何与前台状态或活动状态相关的通知帖子 即在我的应用程序中
  • 如何分组并获取具有最大值的元素 - javascript/node.js

    我有以下数组 我试图通过按 EntryId 分组来获取具有最大 id 的元素node js entryId 7wpNAXhYI id 5 entryId 7wpNAXhYI id 6 entryId 5PGB23RI id 7 entryI
  • Highcharts y 轴天花板未得到尊重

    我在使用 Highcharts 时遇到问题 其中两个 y 轴之一的上限没有得到尊重 Y 轴 1 代表百分比值 因此下限为 0 上限为 100 Y 轴 2 代表货币值 因此下限为 0 上限为null 由于某种原因 y 轴 1 的标签最多为 1
  • 使用 Flexbox 左对齐和居中对齐元素

    我正在使用 Flexbox 来对齐我的子元素 我想做的是将一个元素居中 并使另一个元素靠左对齐 通常我会使用设置左侧元素margin right auto 问题在于将中心元素推离中心 这可能吗without使用绝对定位 HTML 和 CSS
  • 找不到“laravel/homestead”框

    尝试配置 laravel 5 1 克隆了拉拉维尔 家园 将其克隆到之后Home目录 尝试运行 vagrant up 命令时抛出错误 如下所示 user user laravel homestead vagrant up Bringing m
  • 如何在不同的屏幕尺寸上得到完全相同的点?

    我想在用户点击特定区域时调用该操作 转到另一个视图 image 黑点 图像填充整个视图 内容模式为 Aspect Fit 问题是 当我将其设置在一种屏幕尺寸 例如 iPhone 8 上时 点击区域 会发生移动 我尝试使用按钮和约束或使用屏幕
  • 回归:导出的 Bash 函数在经过另一个过程后丢失

    从 Ubuntu 14 04 迁移到 16 04 时 我注意到我的几个 Bash 脚本由于缺少导出函数而失败 我想知道这是否与修复有关炮弹休克虫 尽管我只是简单地export f函数 而不依赖于 Bash 内部函数表示 仅当中间有另一个进程
  • 如何解决android studio中的gradle冲突?

    Please find my gradle file below 正如您所看到的 它显示红色 如果我将光标放在那里 我会得到提示 所有 com android support 库必须使用完全相同的版本规范 找到 com android su
  • 从asp.net代码获取某个网站的源代码

    有没有什么方法可以让我从 asp net 网站代码后面的一些 C 代码获取网站的源代码 最好是字符串 比如说 www google com 编辑 当然 我的意思是 html 代码 在每个浏览器中 您可以使用 viewsource 在上下文菜
  • 在 .net core、xUnit 项目中获取代码覆盖率

    我正在尝试使用以下方向的指示来获取 net core 项目中的代码覆盖率https github com Microsoft vstest docs blob master docs analyze md working with code
  • 从周日开始获取一周的问题

    以下是我创建的用于将星期日作为一周的开始日的函数 function getCurrentIntervalOfWeek liveratetime get start of each week dayofweek date w liverate
  • 变量仅在 for 循环内本地分配[重复]

    这个问题在这里已经有答案了 我正在做第一个 Kaggle 挑战 我对这种行为感到惊讶 组合由两个pd DataFrame组成 一个是训练集 另一个是测试集 我想删除两列 因此我创建了一个 for 循环来迭代组合中的项目 for datase
  • Python库“unittest”:以编程方式生成多个测试[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Python 中生成动态 参数化 单元测试 我有一个功能要测试 under test 以及一组预期的输入 输出对 2 332 234 99213 9 3 我希望这些输入 输出对中的每一对都单独
  • 如何将一组形状保存为 JPG 图像?

    我使用 VBA 在图像上放置了多个形状 并希望将整个组保存为 JPG Sub SaveImageTEST ActiveSheet Shapes Range Array Picture 1 SaveAsPicture worldmap jpg
  • Oracle语法左连接三个或更多表

    我正在尝试了解旧的 Oracle Left Join 语法 有两个表就可以了 FROM A B WHERE A Col B Col 我们将此查询称为 Q0 这很容易理解 例如和这个维恩diagram 但是 当我们添加第三个或更多表时 我的大