最近遇到一个 bug 【Doc ID 2392016.1】,使用 Oracle 连接语法可以规避。
现将 Oracle 连接语法记录如下。
笛卡尔乘积(Cartesian Products)
SELECT last_name, department_name FROM employees, departments;
为了避免笛卡尔乘积,一定要在 where 子句中包含一个有效的连接条件。
等值连接(Equijoins)
SELECT e.last_name, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;
在Oracle连接语法中,连接条件写在 where 子句中。Write the join condition in the WHERE clause.
自连接(self-join)
SELECT worker.last_name as "worker", manager.last_name as "manager"
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;
非等值连接(Nonequijoins)
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
外连接
外连接的符号是加号+,把它放在不需要全部显示的列的后面,可以这么记忆,哪边少些,哪边就加点儿。
右外连接加左边,左外连接加右边。
下面是左外和右外的示例(假设grant没在任何部门中,部门contracting没有部门编号,也没有任何员工):
左外连接:
SELECT e.last_name as ename, e.department_id as did, d.department_name as dname
FROM employees e, departments d
WHERE e.department_id = d.department_id(+) ;
ename did dname
------- ------- -------
Grant null null
右外连接:
SELECT e.last_name as ename, e.department_id as did, d.department_name as dname
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id ;
ename did dname
------- ------- -------
null null Contracting
注意:Oracle连接语法不支持全外连接。 Oracle's join syntax does not have an equivalent for the FULL OUTER JOIN of the SQL:1999-compliant join syntax.