【问题标题】:SQL Self/Inner Join from same table [duplicate]来自同一个表的 SQL Self/Inner Join [重复]
【发布时间】:2021-12-30 02:56:03
【问题描述】:

我正在努力为这个表(办公室)应用一个简单的 JOIN 命令:

+-----------+-------+------+
| Employee  | Name  | Boss |
+-----------+-------+------+
|         1 | Joe   |    2 |
|         2 | Chris |    3 |
|         3 | Rob   |    2 |
|         4 | Dean  |    1 |
+-----------+-------+------+

我看到了很多使用 2 个表的示例,我试图重现这些示例,这让我可以这样做:

SELECT office.Name
FROM office
INNER JOIN office
    ON office.Employee = office.Boss; 

我正在尝试将员工推荐给它的老板

但是这段代码给了我:不是唯一的表/别名:'office' 有什么简单的解决方案?甚至可能根本不使用 JOIN..

【问题讨论】:

  • 您的样本数据中有 Chris 和 Rob 是彼此的老板 - 对吗?
  • 另外,为什么表office包含与人有关的信息?
  • 使用表别名!
  • “我正在尝试将员工推荐给它的老板” - 使用自我 JOIN 仅适用于单个引用 btw - 如果你想找出某人的最高老板是谁,你会需要递归 CTE。

标签: sql join


【解决方案1】:

您需要使用表别名,因为您在查询中有多个同名的表。例如:

SELECT a.Name, b.Name
FROM office a
INNER JOIN office b
    ON a.Employee = b.Boss; 

在这种情况下,查询包括表office 的两个“实例”。为了确保您使用属于正确表的正确列,您需要为每个实例使用表别名;在这种情况下ab

【讨论】:

    【解决方案2】:

    您需要使用AS 关键字(在FROM 子句中)为每个表指定不同的别名:

    SELECT
        employee.Name AS ThisPerson,
        boss.Name     AS HasThisBoss
    FROM
        office AS employee
        INNER JOIN office AS boss ON
            boss.Employee = employee.Boss;
    

    仅供参考:SQL 中的 AS 关键字被重载,并且根据上下文有非常不同的用途:

    • 列别名:SELECT foo.X AS bar FROM qux
    • 表别名:SELECT foo.X FROM qux AS foo
    • 计算列:ALTER TABLE foo ADD bar AS ( X + Y )
    • CAST 中的类型说明符:SELECT CAST( x AS int ) AS x2

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2013-01-25
      • 2015-02-14
      相关资源
      最近更新 更多