如何对 >2 个表进行外连接 (Oracle)

2024-01-09

我不知道如何描述我的表结构,所以希望这是有道理的......

我有 3 个具有层次关系的表,其中 A 与 B 具有一对多关系,而 B 又与 C 具有一对多关系。诀窍是 B 和 C 中的外键允许为空(即没有父级)定义)。我还有 D 和 E,与 A、B 或 C 没有关系(直接)。

最后,我有 F,它是一个与 C、D 和 E 具有多对一关系的连接表。它的所有字段(其他表的 FK)都不能为空。

我想编写一个 SQL 语句,将所有表连接到一个结果集中。我知道我必须使用外连接,因为我希望返回所有 A,无论它在 B 中是否有子级,并且与 B 和 C 类似。

问题一:我一直在研究 ANSI 外连接语法(我之前只使用过 Oracle“(+)”),但找不到外连接超过 2 个表的示例。有人可以提供/指出一个例子吗?

问题二:是否可以基于连接表F包含表D和E中的记录?如果是这样,这是通过外连接完成的吗?

Thanks!

EDIT

当然,在我发布这篇文章后,我找到了一个回答问题1的例子。但是,问题2仍然难倒了我。

Example:

         SELECT A.a,
                B.b,
                C.c
           FROM A
FULL OUTER JOIN B ON B.a = A.a
FULL OUTER JOIN C ON C.b = B.b

所以我将你的模式想象成这样:

A --o< B --o< C --< F >-- D
                      >-- E

您当然可以进行多个连接,也可以使用括号对连接表达式进行分组,就像对算术表达式进行分组一样。

SELECT ...
FROM A LEFT OUTER JOIN (
  B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
      F INNER JOIN D ON D.d = F.d
        INNER JOIN E ON E.e = F.e
      ) ON C.c = F.c
    ) ON B.b = C.b
) ON A.a = B.a

这些括号是not子查询,它们只是对连接操作进行分组。

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

如何对 >2 个表进行外连接 (Oracle) 的相关文章

  • 正则表达式中 (*) 和 .* 有什么区别? [复制]

    这个问题在这里已经有答案了 是任意字符零次或多次 我试图找到以元音开头的单词 我用了 aeiou 它给了我所有以元音开头的单词 当我这样做时给出相同的结果 aeiou 现在我正在寻找以元音结尾的单词 我做到了 aeiou 它没有给出任何结果
  • oracle 计算两个字符串中连续匹配的单词

    我想要一个返回两个字符串中单词的顺序匹配数的查询 例子 Table Id column1 column2 result 1 foo bar live foo bar 2 2 foo live tele foo tele 1 3 bar fo
  • 什么时候空值在列中“安全”?

    设计数据库时是否存在允许列为空与 3nf 规范化的一般经验法则 我有一个表 其中的列主要由空值 85 组成 但表大小不超过 10K 记录 不是很大 它主要用于日志记录和记录保存 因此大多数事务将是插入和选择 而不是更新 我试图同时考虑性能和
  • 使用多个小数点 (.) 对 Oracle 中的记录进行排序

    UPDATE 甲骨文版本10G 我有一个记录列表Oracle如下 这些其实是各种书籍的章节记录按以下格式生成 主主题 子主题 第一级部分 最后级部分 Sections 1 7 1 6 2 7 1 7 4 6 8 3 6 8 2 10 1 1
  • sql 查询查找匹配属性

    我目前正在做一个类似易货系统的系统 情况是这样的 客户 Jasmine 要求输入 NAME 属性 她需要寻找的内容 并输入 SEEK 属性 她需要寻找的内容 为了获得结果 SEEK 属性必须与其他客户的 Name 属性匹配 其他客户的 SE
  • 创建每 5 分钟刷新一次的物化视图

    我创建了一个每 5 分钟刷新一次的物化视图 但是当我在物化视图上插入并执行选择时 我会得到相同的旧数据吗 需要手动刷新吗 CREATE MATERIALIZED VIEW MVW TEST REFRESH FORCE ON DEMAND S
  • java.library.path 中没有 ocijdbc12

    我正在尝试使用 OCI 驱动程序通过 java 程序连接到 oracle 以下是配置 Windows 7 32 位 JDK 1 7 Oracle 客户端 11g R2 ojdbc7 jar在我的独立应用程序的类路径中 但我收到以下异常 Ex
  • Oracle SQL - 将 oracle sql 中的 id 更新为按顺序排列

    我在 Oracle SQL 中有一个表 其 id 按递增顺序排列 但由于编辑原因 id 中存在间隙 例如id 目前类似于 22 23 24 32 33 44 etc 我想通过浏览表中的每一行并更新它们来修复这些差距 这样就不会有差距 最好的
  • 如何获取Oracle中命名事务的名称?

    我想在触发器中使用事务的名称 以便将其写入列中 我尝试了这个 在 SQL Developer 中 set transaction name hello select DBMS TRANSACTION LOCAL TRANSACTION ID
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • 在 Oracle 临时表上放置索引安全吗?

    我读过 不应分析临时表 因为它会破坏其他表的统计信息 指数怎么样 如果我在程序运行期间在表上放置索引 使用该表的其他程序会受到该索引的影响吗 索引是否会影响我的进程以及使用该表的所有其他进程 或者它会单独影响我的过程吗 所有的回复都不是权威
  • (PLSQL) 在 Oracle 更新触发器中测试更改值的最简单表达式是什么?

    这是一个可以解决问题的布尔表达式 nvl new location old location new location is null old location is null 但我想有一个更简单的表达方式 有任何想法吗 这些较短的方法都有
  • SQL:两个没有完整列匹配的表的并集

    我有一个table A其中有一组列A1 A2和一个具有一组列的 table bB1 B2 碰巧的是A2 B1但其余列不匹配 也不应该匹配 我想附加表格 所以我使用UNION ALL 对于不匹配的列 我使用null as COLUMN NAM
  • 从 Oracle Varchar2 中查找并删除非 ASCII 字符

    我们目前正在将一个 Oracle 数据库迁移到 UTF8 并且发现一些记录接近 4000 字节 varchar 限制 当我们尝试迁移这些记录时 它们会失败 因为它们包含的字符变成了多字节 UF8 字符 我想要在 PL SQL 中做的是找到这
  • 在 Oracle 中创建数据库链接时出错

    我有两个数据库 需要编写跨数据库查询 所以我试图创建一个数据库链接 CREATE PUBLIC DATABASE LINK DBLink CONNECT TO SchemaName IDENTIFIED BY 123 using DBNam
  • 用C++连接oracle数据库

    我正在寻找一种方法来连接到远程 Oracle 数据库并从 C 控制台应用程序中的表中读取一些数据 有人可以给我一些提示吗 谢谢 soci http soci sourceforge net http soci sourceforge net
  • 在 C# 中多次使用单个参数的更好方法

    我刚开始使用准备好的语句从数据库查询数据 并且在实现 C 参数 特别是 OracleParameters 时遇到问题 假设我有以下 SQL string sql select from table1 t1 table2 t2 where t
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 如何使用 Hibernate Session.doWork(...) 进行保存点/嵌套事务?

    我正在使用 JavaEE JPA 托管事务与 Oracle DB 和 Hibernate 并且需要实现某种嵌套事务 据我所知 此类事情不受开箱即用的支持 但我应该能够为此目的使用保存点 正如建议的https stackoverflow co
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle

随机推荐