在 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】:您可以尝试按顺序左加入Employees
、Departments
和Areas
表。我们在 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 个以上的表的主要内容,如果未能解决你的问题,请参考以下文章