Oracle 中完全外连接的奇怪行为 - 如何解释?

2023-12-19

我注意到 Oracle 11 中 FULL OUTER JOIN 的奇怪行为。我正在连接 HR 模式中的表,特别是 EMPLOYEES 和 DEPARTMENTS。

例如,以下查询返回 123 行:

    SELECT * FROM employees e
    FULL JOIN departments d ON e.department_id = d.department_id

然而,难以理解的是 - 当我在 select 子句中放入一组特定列时,查询将返回 122 行(缺少的行是针对没有分配部门的员工的 - 该行是通过左连接另外返回的)与内连接相比):

    SELECT first_name, last_name, department_name FROM employees e
    FULL JOIN departments d on e.department_id = d.department_id

即使当我计算行数时它也会返回 122 (COUNT(*))!!!到底是怎么回事?有什么区别SELECT * and SELECT COUNT(*)?

解释计划为SELECT * ... :

SELECT STATEMENT                                      122
  VIEW                 VW_FOJ_0                       122
    HASH JOIN                          FULL OUTER     122
      Access Predicates
        E.DEPARTMENT_ID = D.DEPARTMENT_ID
      TABLE ACCESS     DEPARTMENTS     FULL            27
      TABLE ACCESS     EMPLOYEES       FULL           107

and for SELECT COUNT(*) ... :

SELECT STATEMENT                                             1
  SORT                                     AGGREGATE         1
    VIEW               VW_FOJ_0                            122
      HASH JOIN                            FULL OUTER      122
        Access Predicates
          E.DEPARTMENT_ID = D.DEPARTMENT_ID
        INDEX          DEPT_ID_PK          FAST FULL SCAN   27
        INDEX          EMP_DEPARTMENT_IX   FAST FULL SCAN  107

优化器不应选择在第二个查询中使用 EMP.DEPT_ID 上的索引,因为它可能具有 NULL 值。这就是导致它从结果中排除一行的原因。

目前我能想到的唯一非错误解释是,您以某种方式在 DISABLE RELY 模式下创建了约束,以便优化器认为该字段不能包含 NULL。在这种情况下,如果约束中的信息不正确,则使用索引是正确的。然而,似乎 RELY 选项不适用于 NOT NULL 约束,所以我不明白这怎么可能是问题。尽管如此,请仔细查看表格上的所有限制。

除此之外,Oracle 网站上存在数量惊人的关于完全外连接错误结果的错误。你可能会击中其中之一。在相当多的情况下,解决方法是禁用“本机”完全外部联接,您可以使用以下语句对当前会话执行此操作:

alter session set "_optimizer_native_full_outer_join"=off; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 中完全外连接的奇怪行为 - 如何解释? 的相关文章

  • 使用 TLS 证书 JDBC 连接到 Oracle 数据库

    我正在尝试用 Java 编写一个连接类来使用 JDBC 驱动程序连接到 Oracle 数据库 但我想保护用于连接到 Oracle 数据库的参数 例如 jdbcurl 用户名 密码 我必须使用 TLS 证书概念来连接到 Java 中的 Ora
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • Linq To SQL - 拥有和分组依据

    我下面这个查询工作正常 不过我想使用 Linq 来实现它 select u ID u NAME from Task t join BuildingUser bu ON bu ID BUILDING t ID BUILDING join Us
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • Postgresql 一张表的多个计数

    我想从表中的两列中获得这些列中值的统一计数 例如 两列是 表 报告 type place one home two school three work four cafe five friends six mall one work one
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • 为什么 WinDbg、任务管理器和 VS 调试器报告的线程数不同?

    当我的 Net 3 5 应用程序运行时 Windows 任务管理器显示我的应用程序有 16 个线程 我收集了该进程的内存转储并使用 WinDbg SOS 打开它 运行 threads 命令显示我有 ThreadCount 456 Unsta
  • 如何将 2 个 zip 文件合并为 1 个?

    我有 2 个 zip 文件 zip1 和 zip2 我需要将这些文件合并为一个 我该如何解决 我知道我可以修复它 将 ZIP1 解压到临时文件夹 然后将其添加到 zip2 但我认为效率很低 更快的方法是什么 我在用着System IO Co
  • Android:创建自定义资源类

    Android 上的 R 类有其局限性 您不能动态使用资源来加载音频 图片或其他内容 例如 如果您不想为选定的对象加载一组音频文件 则您不能执行以下操作 R raw string upon choosen object 我是 android
  • Jenkins 签出 GIT 项目失败,权限被拒绝致命:无法分叉

    我有一个 Freestyle Jenkins 项目 它使用 bitbucket 作为 SCM 使用 ssh 作为协议和私钥 不是用户 密码 当我在 master 上构建项目时 它失败并显示以下堆栈跟踪 而它在代理上运行良好 注意错误提到 s
  • X-Frame-Options 禁止 Facebook 应用程序错误

    我正在构建一个 Facebook 应用程序 目前它处于沙盒模式 我的代码 索引 php
  • Slick 3.0如何更新变量列列表,哪个数字只有在运行时才知道

    是否可以更新变量列列表 其中的数字仅在运行时由 slick 3 0 知道 下面是我想要做的示例 不会编译 var q Query UserTable UserTable TableElementType Seq userTable var
  • 隐式参数和函数

    我在考虑 Haskell GHC 中的隐式参数时遇到问题 我有一个函数f 假设隐式参数x 并希望通过应用将其封装在上下文中f to g f x Int gt Int gt Int f n n x g Int gt Int gt Int gt
  • 如何用范围填充可变参数?

    填充可变参数的正确方法是什么 我的尝试看起来像自行车 首先我构建范围然后我将其转换为列表然后到 intarray然后传播它 m getColumns count count 35 toList toIntArray 其中 getColumn
  • 将字符串插入工作表会导致插入数字

    在我的 Google Apps 脚本中 我在电子表格中添加了一行 在附加的这一行中 我尝试插入一个值 0102 的字符串 但是插入时它会转换为数字 102 有没有什么方法可以使用 Google Apps 脚本将值插入到工作表中 而不会格式化
  • Ubuntu 自动从 Github 存储库中拉取

    我在我的服务器上安装了 git 但我希望每当我推送本地所做的更改时它都会从我的 github 存储库中提取 我研究过钩子 但它非常令人困惑 而且我找不到任何教程 有谁知道这是怎么做到的吗 我希望我的服务器在每次提交后从存储库中提取 这看起来
  • JPA 和 PostgreSQL 与 GenerationType.IDENTITY

    我有关于 Postgres 和 GenerationType Identity 与 Sequence 的问题 在这个例子中 Id SequenceGenerator name mytable id seq sequenceName myta
  • PySpark Worker 中 rdd.collect() 上的 ModuleNotFoundError

    我正在 python 中运行 Apache Spark 程序 并且收到一个我无法理解且无法开始调试的错误 我有一个驱动程序 它在名为 hound py 的文件中定义了一个名为 hound 的函数 在同一目录中 我有一个名为 hound ba
  • PHP Websocket 在测试中验证用户身份(传递会话 cookie)

    我正在尝试测试一个场景 一方面 匿名用户应立即断开与 Websocket 连接的连接 另一方面 经过身份验证的用户应保持 Websocket 连接 第一种情况很容易使用下面的代码进行测试 身份验证过程不起作用 对于会话存储 我将 Cooki
  • 具有多种格式的 Moshi LocalDateTime 适配器

    默认情况下 ThreeTenABP LocalDateTime 转换为 date day 10 month 4 year 2018 time hour 3 minute 34 nano 115000000 second 18 我可以编写一个
  • Magento 客户/会话不工作

    这个问题首先被意识到是因为前端的订单历史页面 sales order history 只显示一条短消息 您没有下订单 经过一番调试 发现问题出在这个函数上 Mage getSingleton customer session 它不会返回包含
  • 为什么 Plastic SCM 不断询问我是否信任复制服务器的证书?

    每次运行类似命令时 我开始收到以下提示cm status cs 630 rep MyServer repserver ssl
  • 出现“类型错误...$(...).modal 不是函数

    我正在尝试使用引导模式创建和编辑用户更新注释的函数 在 REACT 项目中 但这是我得到的错误 Uncaught in promise TypeError jquery WEBPACK IMPORTED MODULE 1 default m
  • 查找数组中所有元素都具有特定值的文档

    这基本上是一个简单的问题 但我找不到它的查询函数 示例集合 id 1 foo bar 9 bar 16 id 2 foo bar 9 bar 9 bar 9 示例输出 id 2 foo bar 9 bar 9 bar 9 因为这是唯一一个每
  • python pyplot连接点

    我正在使用一组点制作 pyplot 图 plt plot range 0 10 dictionary key bo 这按照我的预期正确地绘制了点 但是我也希望在这些点之间绘制一条线 我找不到用 pyplot 来做到这一点的方法 我认为这是微
  • Oracle 中完全外连接的奇怪行为 - 如何解释?

    我注意到 Oracle 11 中 FULL OUTER JOIN 的奇怪行为 我正在连接 HR 模式中的表 特别是 EMPLOYEES 和 DEPARTMENTS 例如 以下查询返回 123 行 SELECT FROM employees