在 Oracle 中使用连接语法连接 3 个以上的表

Posted

技术标签:

【中文标题】在 Oracle 中使用连接语法连接 3 个以上的表【英文标题】:Joining 3+ tables with join syntax in Oracle 【发布时间】:2016-08-24 10:47:03 【问题描述】:

我已经使用连接很长时间了,但它一直是旧语法。现在我正在尝试弄清楚如何使用 JOIN 语法进行基本的内部连接,但无法弄清楚。

假设我有 3 张桌子。

员工:

EmployeeID      EmployeeName        DepartmentID
1               John Smith          2
2               Jane Doe            3
3               Mark Brown          1

部门:

DepartmentID        DepartmentName      AreaID
1                   Sales               2
2                   Marketing           1
3                   Opeations           3

地区:

AreaID      AreaName
1           Marketing
2           Sales
3           Opeartions

我需要获取所有员工姓名及其部门和区域的列表。

使用旧语法,我将运行以下查询:

select e.EmployeeName, d.DepartmentName, a.AreaName
from employees e, departments d, areas a
where e.DepartmentID = d.DepartmentID
and d.AreaID = a.AreaID

使用新语法,我似乎只能将员工与部门联系起来,但不能将部门与同一查询中的区域联系起来。或者我应该使用子选择吗?

【问题讨论】:

select ... from t1 join t2 on t1.c = t2.c join t3 on t2.c = t3.c 主要区别在于“事物的顺序” - 使用旧的 Oracle 专有语法,您可以一次性枚举所有连接的表,然后将所有连接条件放在 @ 987654325@ 子句。使用 SQL 标准语法,您命名要连接的前两个表,然后立即添加连接条件 (on ...)。然后你说join third_table 和连接条件,显示第三个表如何连接到前两个表的现有连接。等等。 【参考方案1】:

试试这个。

select e.EmployeeName, d.DepartmentName, a.AreaName
from employees e  join departments d on e.DepartmentID = d.DepartmentID
                  join areas a on d.AreaID = a.AreaID;

【讨论】:

【参考方案2】:

您可以尝试按顺序左加入EmployeesDepartmentsAreas 表。我们在 Stack Overflow 上很细致,所以我们选择了 LEFT JOIN 而不是 INNER JOIN,因为它处理了员工可能没有被分配到部门的可能性,在这种情况下,查询将显示 NA 作为值.

SELECT e.EmployeeName,
       COALESCE(d.DepartmentName, 'NA'),
       COALESCE(a.AreaName, 'NA')
FROM Employees e
LEFT JOIN
Departments d
    ON e.DepartmentID = d.DepartmentID
LEFT JOIN Areas a
    ON d.AreaID = a.AreaID

【讨论】:

【参考方案3】:

我发现this 对连接的解释非常有用。 您的查询将如下所示:

SELECT e.EmployeeName, d.DepartmentName, a.AreaName
FROM employees e 
INNER JOIN departments d on e.DepartmentID = d.DepartmentID
INNER JOIN areas a on d.AreaID = a.AreaID

【讨论】:

【参考方案4】:

您编写的代码是Inner Join 的替代代码。 您可以使用下面的代码。 所以我所做的是使用 DepartmentID 将 Employee 表连接到 Department 表,并使用 AreaID 将 Employee 表连接到 Areas 表。

Select e.EmployeeName
, d.DepartmentName
, a.AreaName
from employees e
INNER JOIN departments d
, areas a
ON e.DepartmentID = d.DepartmentID
INNER JOIN areas a
ON d.AreaID = a.AreaID

【讨论】:

以上是关于在 Oracle 中使用连接语法连接 3 个以上的表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle左连接右连接全外连接(+)号作用

(+)mysql中外部连接的语法[重复]

Oracle中的连接池大小概念

Oracle中 能连接两个或多个字符的运算符是啥

Windows下PHP7/5.6以上版本 如何连接Oracle 12c,并使用PDO

webRTC多点连接(3个客户端及以上)