作者:胖头鱼的鱼缸(尹海文) Oracle ACE Pro: Database PostgreSQL ACE 10年+数据库行业经验 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP,ITPUB认证专家 圈内拥有“总监”称号,非著 名社恐(社交恐怖分子) 全网同名:胖头鱼的鱼缸 ITPUB:yhw1809 除授权转载并标明出处外,均为“非法”抄袭

众所周知,我会在每次Oracle AI Database 26ai(包含以前23c/23ai)季度更新时,对更新的新特性进行总结,如最近一期: 《数据库管理-第423期 Oracle AI DB 23.26.2新特性一览(20260504)》。但是一直缺少对其中新特性的适用场景的介绍和实际测试。
在前面的 《胖头鱼的技术专栏-431 AI Agent时代的数据安全方案:Oracle Deep Sec介绍(20260609)》中,为了解决多Agent数据安全隔离管控的问题,我对23.26.2新特性进行了详解,但我感觉是完全不够的,因此我将在接下来的几期中,选择一些方便在单机环境演示的新特性进行实战演示,并根据实战内容的理解重新进行详细介绍。
本期带来的新特性: JOIN TO ONE连接方法与语法。
JOIN TO ONE(下简称JTO)是Oracle AI Database 23.26.2 引入的一种现代连接语法,旨在简化FROM子句的编写,同时防止常见的连接错误。它通过将连接表达为"非乘性"(non-multiplying)操作,确保每个结果行与"行扩展表"(Row-Widened Tables, RWTs)的行子集一一对应。如果某个连接会为每个RWT行返回多行匹配结果,数据库将在执行时抛出错误,从而显式地保证连接基数的正确性。
row_widened_table_expression JOIN TO ONE ( jto_join_list ) jto_join_list: [ [LEFT] OUTER JOIN | INNER JOIN ] table [ON condition] [, table [ON condition] ]...
ORA-18640 error - JOIN TO ONE reached multiple rows:连接返回了多行,违反了"一对一"约束
ORA-18641 - No join key found:未找到连接键(缺少 FK 关系且未指定 ON 子句)
创建用户NFTEST,并授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
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;

SELECT e.emp_id, e.emp_name, d.dept_name FROM jto_employees e JOIN TO ONE (jto_departments d);
3条结果,由外键自动推断匹配。
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);
由ON子句指定匹配,结果与测试1一致。
-- 添加一个没有部门的员工 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;
结果中包含未匹配的行。
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);
3行数据同时包含dept_name和mgr_name。
SELECT d.dept_id, d.dept_name, e.emp_name, p.proj_name FROM jto_departments dJOIN TO ONE (jto_employees e ON e.dept_id = d.dept_id, jto_projects p ON p.dept_id = d.dept_id);
Dept有2个employees,因此部门和员工违反了TO ONE规则。
SELECT e.emp_id, e.emp_name, p.proj_name FROM jto_employees e JOIN TO ONE (jto_projects p);
jto_projects有到departments的外键,但没有到employees的。
本期对JOIN TO ONE特性进行了完整介绍与实战演示,该新特性由23.26.2中引入,这是一个面向于应用开发非常好的新特性。
老规矩,知道写了些啥。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31466763/viewspace-3174955/ ,如需转载,请注明出处,否则将追究法律责任。