首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >26ai新特性实战:JOIN TO ONE

26ai新特性实战:JOIN TO ONE

作者头像
胖头鱼的鱼缸
发布2026-07-02 15:53:29
发布2026-07-02 15:53:29
40
举报

胖头鱼的技术专栏-437 26ai新特性实战:JOIN TO ONE(20260701)

914fcc7ad57defa7868c3be1ca7fb4f5.jpg
914fcc7ad57defa7868c3be1ca7fb4f5.jpg

众所周知,我会在每次Oracle AI Database 26ai(包含以前23c/23ai)季度更新时,对更新的新特性进行总结,如最近一期:Oracle AI DB 23.26.2新特性一览。但是一直缺少对其中新特性的适用场景的介绍和实际测试。

在前面的AI Agent时代的数据安全方案:Oracle Deep Sec介绍中,为了解决多Agent数据安全隔离管控的问题,我对23.26.2新特性进行了详解,但我感觉是完全不够的,因此我将在接下来的几期中,选择一些方便在单机环境演示的新特性进行实战演示,并根据实战内容的理解重新进行详细介绍。

本期带来的新特性:JOIN TO ONE连接方法与语法

1 特性介绍

JOIN TO ONE(下简称JTO)是Oracle AI Database 23.26.2 引入的一种现代连接语法,旨在简化FROM子句的编写,同时防止常见的连接错误。它通过将连接表达为"非乘性"(non-multiplying)操作,确保每个结果行与"行扩展表"(Row-Widened Tables, RWTs)的行子集一一对应。如果某个连接会为每个RWT行返回多行匹配结果,数据库将在执行时抛出错误,从而显式地保证连接基数的正确性。

2 核心优势

  1. 防止笛卡尔积(Cartesian Product):自动检测并阻止一对多连接
  2. 防止"裂隙陷阱"(Chasm Trap):避免父行在多个子表间扇出导致结果膨胀
  3. 外键推断:当Schema中声明了FK→PK/UK关系时,可省略ON子句
  4. 语法简洁:多个表共享同一个JOIN TO ONE上下文,减少代码重复

3 核心语法

代码语言:javascript
复制
  row_widened_table_expression JOIN TO ONE ( jto_join_list )

  jto_join_list:
    [ [LEFT] OUTER JOIN | INNER JOIN ] table [ON condition]
    [, table [ON condition] ]...
  • 当存在 FK→PK/UK 关系时,ON 子句可省略(自动推断连接条件)
  • 可指定 LEFT OUTER JOIN 包含未匹配的行
  • 括号内可列多个表,用逗号分隔

4 适用场景

  • 数据仓库查询中,需要安全地将维度表连接到事实表,避免意外的行数膨胀
  • 报表系统中,从父表同时关联多个子表时,防止"裂隙陷阱"导致数据夸大
  • 应用开发中,编写安全的连接查询,减少因连接错误导致的隐性数据问题
  • 数据迁移时,验证表间关系的基数约束

5 关键报错信息

ORA-18640 error - JOIN TO ONE reached multiple rows:连接返回了多行,违反了"一对一"约束 ORA-18641 - No join key found:未找到连接键(缺少 FK 关系且未指定 ON 子句)

6 实战演示

创建用户NFTEST,并授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。

创建测试表并添加测试数据

代码语言:javascript
复制
CREATE TABLE jto_departments (
  dept_id   NUMBER PRIMARY KEY,
  dept_name VARCHAR2(50)
);

CREATE TABLE jto_managers (
  mgr_id    NUMBER PRIMARY KEY,
  mgr_name  VARCHAR2(50)
);

CREATE TABLE jto_employees (
  emp_id   NUMBER PRIMARY KEY,
  emp_name VARCHAR2(50),
  dept_id  NUMBER REFERENCES jto_departments(dept_id),
  mgr_id   NUMBER REFERENCES jto_managers(mgr_id)
);

CREATE TABLE jto_projects (
  proj_id   NUMBER PRIMARY KEY,
  proj_name VARCHAR2(50),
  dept_id   NUMBER REFERENCES jto_departments(dept_id)
);

INSERT INTO jto_departments VALUES (10, 'Engineering');
INSERT INTO jto_departments VALUES (20, 'Sales');

INSERT INTO jto_managers VALUES (1, 'Smith');
INSERT INTO jto_managers VALUES (2, 'Jones');

INSERT INTO jto_employees VALUES (1, 'Alice', 10, 1);
INSERT INTO jto_employees VALUES (2, 'Bob',   10, 1);
INSERT INTO jto_employees VALUES (3, 'Carol', 20, 2);

INSERT INTO jto_projects VALUES (1, 'Alpha', 10);
INSERT INTO jto_projects VALUES (2, 'Beta',  10);
INSERT INTO jto_projects VALUES (3, 'Gamma', 20);

COMMIT;
image.png
image.png

测试1:有外键情况下,不使用ON子句的基本JTO测试

代码语言:javascript
复制
SELECT e.emp_id, e.emp_name, d.dept_name
FROM jto_employees e JOIN TO ONE (jto_departments d);
image.png
image.png

3条结果,由外键自动推断匹配。

测试2:使用ON子句的JTO测试

代码语言:javascript
复制
SELECT e.emp_id, e.emp_name, d.dept_name
FROM jto_employees e JOIN TO ONE (jto_departments d ON e.dept_id = d.dept_id);
image.png
image.png

由ON子句指定匹配,结果与测试1一致。

测试3:LEFT OUTER JON的JTO测试

代码语言:javascript
复制
-- 添加一个没有部门的员工
INSERT INTO jto_employees VALUES (4, 'Dave', NULL, NULL);
COMMIT;

SELECT e.emp_id, e.emp_name, d.dept_name
FROM jto_employees e JOIN TO ONE (LEFT OUTER JOIN jto_departments d ON e.dept_id = d.dept_id);

-- 清理多余的行
DELETE FROM jto_employees WHERE emp_id = 4;
COMMIT;
image.png
image.png

结果中包含未匹配的行。

测试4:多表JTO(两张表都有外键)

代码语言:javascript
复制
SELECT e.emp_id, e.emp_name, d.dept_name, m.mgr_name
FROM jto_employees e JOIN TO ONE (jto_departments d, jto_managers m);
image.png
image.png

3行数据同时包含dept_name和mgr_name。

测试5:报错测试

代码语言:javascript
复制
SELECT d.dept_id, d.dept_name, e.emp_name, p.proj_name
FROM jto_departments d
JOIN TO ONE (jto_employees e ON e.dept_id = d.dept_id,
             jto_projects p ON p.dept_id = d.dept_id);
image.png
image.png

Dept有2个employees,因此部门和员工违反了TO ONE规则。

代码语言:javascript
复制
SELECT e.emp_id, e.emp_name, p.proj_name
FROM jto_employees e JOIN TO ONE (jto_projects p);
image.png
image.png

jto_projects有到departments的外键,但没有到employees的。

总结

本期对JOIN TO ONE特性进行了完整介绍与实战演示,该新特性由23.26.2中引入,这是一个面向于应用开发非常好的新特性。

老规矩,知道写了些啥。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 胖头鱼的鱼缸 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 胖头鱼的技术专栏-437 26ai新特性实战:JOIN TO ONE(20260701)
    • 1 特性介绍
    • 2 核心优势
    • 3 核心语法
    • 4 适用场景
    • 5 关键报错信息
    • 6 实战演示
      • 创建测试表并添加测试数据
      • 测试1:有外键情况下,不使用ON子句的基本JTO测试
      • 测试2:使用ON子句的JTO测试
      • 测试3:LEFT OUTER JON的JTO测试
      • 测试4:多表JTO(两张表都有外键)
      • 测试5:报错测试
    • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档