【问题标题】:need help joining two tables, sql需要帮助加入两个表,sql
【发布时间】:2023-04-09 12:30:01
【问题描述】:

我已经搜索了 stackoverflow,但找不到我的问题的答案。

表1有两列

  1. employee_id
  2. 员工姓名

表 2 有两列

  1. employee_id
  2. Manager_id

Manager_id 是 Employee_id 的子集,这反过来意味着经理的姓名将在 Employee_name 列表中可用。

如何加入这两个表以获得如下结果:employee_id、Employee_name、Manager name。

我的查询:

SELECT employee_id,
       employee_name,
       manager_id AS manager_name
FROM   table1
       LEFT JOIN table2
              ON table1.employee_id = table2.employee_id
WHERE  manager_id = employee_id; 

请针对这种情况提出适当的方法。

提前致谢。

【问题讨论】:

  • 您需要第二次加入。第一次加入是从 t1 到 t2 以获取员工的经理。下一次连接将从 t2 再次返回到 t1 以获取管理器的名称。

标签: sql join oracle-sqldeveloper


【解决方案1】:

您需要重新加入table1:

select 
    employees.employee_name.employee_id,
    employees.employee_name,
    managers.employee_name as manager_name
from table1 as employees
    left join table2
        on table2.employee_id = employees.employee_id
    left join table1 as managers
        on managers.employee_id = table2.manager_id

此外,由于您已经通过 JOIN 子句过滤到匹配的经理,您可以从原始查询中排除 WHERE

【讨论】:

    【解决方案2】:

    您需要第二次加入。

    • 第一次加入是从 t1 到 t2 以获取员工的经理。
    • 下一次连接将从 t2 再次返回到 t1 以获取管理器的名称。

    我假设您想要所有员工和经理的姓名(如果已定义)。

    SELECT emp.employee_id,
           emp.employee_name,
           mgr.employee_name AS manager_name
    FROM   table1 Emp
    LEFT JOIN table2 t2
     ON emp.employee_id = t2.employee_id
    LEFT JOIN table1 mgr
     on mgr.employee_Id = t2.manager_Id
    

    --这是干什么用的?

    WHERE  manager_id = employee_id;
    

    【讨论】:

    • where条件需要什么
    • 你打败了我,我不知道。
    • 我认为 where 子句实际上会破坏它。它会找到管理自己的员工。
    【解决方案3】:

    我认为WHERE 子句没有意义。试着把它拿出来。这会将您的结果限制在管理自己的员工身上。

    另外,请添加表格别名。即使没有 where 子句,也会有歧义。

    最后,单次加入只会让您获得经理的 ID。要获得他们的名字,您需要第二次加入。

    SELECT emp.employee_id,
           emp.employee_name,
           mgr.employee_name AS manager_name
    FROM   table1 emp
           LEFT JOIN table2 map
                  ON map.employee_id = emp.employee_id
           LEFT JOIN table1 mgr
                  ON mgr.employee_id = map.manager_id
    

    【讨论】:

    • 感谢大家的宝贵建议和回答。 +1 :)
    【解决方案4】:

    尝试使用别名的递归连接:

    select a.employee_id, a.employee_name, b.manager_id, c.employee_name as manager_name 
    from table1 a
    left join table2 b on b.employee_id = a.employee_id 
    left Join table1 c on c.employee_id = b.manager_id;
    

    【讨论】:

      【解决方案5】:
      SELECT t1.employee_id,
             t1.employee_name,
             t2.manager_id AS manager_name
      FROM   table1 t1, table2 t2               
      WHERE  t2.employee_id = t1.employee_id; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        相关资源
        最近更新 更多