【问题标题】:Joining 3+ tables with join syntax in Oracle在 Oracle 中使用连接语法连接 3 个以上的表
【发布时间】: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 和连接条件,显示第三个表如何连接到前两个表的现有连接。等等。

标签: sql oracle join


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2012-03-15
          • 1970-01-01
          • 1970-01-01
          • 2015-06-02
          • 2011-07-28
          • 2015-12-31
          • 2015-03-24
          • 2020-08-12
          • 1970-01-01
          相关资源
          最近更新 更多