oracle的sql语句中 a=b(+),代表什么意思
在 Oracle SQL 中,a = b(+)
是一种过时的、Oracle 特有的语法,用于表示外连接。
它的含义是:
(+)
放在哪一边,哪一边就是“可选”的(即可能包含 NULL 行)。
a = b(+)
表示这是一个LEFT OUTER JOIN
。它表示:返回表
a
((+)
符号对面的表)的所有行。同时,尝试去匹配表
b
((+)
符号所在的表)的行。如果表
b
中没有匹配的行,那么对于表b
的所有列,结果集中将用NULL
值填充。
简单来说:a = b(+)
等价于标准的 FROM a LEFT JOIN b ON a.key = b.key
。
关键点:
(+)
的位置决定哪边是驱动表(返回所有行):a = b(+)
->a
是驱动表 ->LEFT JOIN b
(返回所有 a,匹配的 b 或 NULL b)a(+) = b
->b
是驱动表 ->RIGHT JOIN a
(返回所有 b,匹配的 a 或 NULL a)
过时语法: 这是 Oracle 在 ANSI SQL 标准化的
JOIN
语法(INNER JOIN
,LEFT JOIN
,RIGHT JOIN
,FULL JOIN
)普及之前使用的旧语法。Oracle 官方推荐: 强烈建议使用标准的 ANSI SQL
JOIN
语法(LEFT JOIN
,RIGHT JOIN
等)。标准语法更清晰、更易读、更易维护,并且是跨数据库兼容的。Oracle 自己也推荐使用标准语法。理解难点:
(+)
符号放在你希望可能出现NULL
的那个表(非驱动表)的连接条件列上。
示例:
假设有两个表:
employees
(员工表,有emp_id
,name
,dept_id
)departments
(部门表,有dept_id
,dept_name
)
你想列出所有员工及其部门名称,即使某些员工还没有分配部门(dept_id
为 NULL)。
使用旧语法 ((+)
):
SELECT e.name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.dept_id(+);
e.dept_id = d.dept_id(+)
:(+)
在d.dept_id
这边,表示departments
表是可选的。这意味着:返回
employees
表的所有行 (e
)。对于每个员工,如果能在departments
表 (d
) 中找到匹配的dept_id
,就显示对应的dept_name
;如果找不到匹配的部门(即该员工dept_id
为 NULL 或在departments
表中不存在),那么d.dept_name
将显示为NULL
。
使用标准 ANSI SQL 语法 (LEFT JOIN
):
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
结论:
当你看到 a = b(+)
时,它表示一个左外连接,表 a
是驱动表(返回所有行),表 b
是可选的(匹配的行或 NULL)。请优先使用 LEFT JOIN
等标准 SQL 语法编写新代码或重构旧代码。