最近遇到一个 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.

-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 04 月 15 日 05 : 46 PM
如果觉得我的文章对你有用,请随意赞赏