【问题标题】:SQL Self Join not "joining" in PopSQLSQL Self Join 不在 PopSQL 中“加入”
【发布时间】:2021-06-21 14:06:11
【问题描述】:

我目前正在学习 SQL,但遇到了一个障碍。 我一直在网上浏览,并没有发现像我的情况那样“复制”表的情况。

该案例基于一个经典示例,在该示例中,我们希望得到一个结果,其中我们获取员工姓名和具有主管姓名的下一列。

想要的结果:

|Employee Name | Supervisor Name|
---------------------------------
|Dave          | NULL           |
|Rick          | Dave           |
|Andy          | Rick           |

当前表是这样的(员工):

|emp_id | first_name | last_name| super_id |
--------------------------------------------
|100    | Dave       | Star     |  NULL    |
|101    | Rick       | Port     |  100     |
|101    | Andy       | Huds     |  101     |

我正在尝试在 POPSQL(基于 MySQL)中使用 SELF JOIN 来完成此操作,但首先我将展示如何创建员工表。

CREATE TABLE employee (
    emp_id INT PRIMARY KEY,
    first_name  VARCHAR(40), 
    super_id INT,
);

ALTER TABLE employee
ADD FOREIGN KEY (super_id)
REFERENCES employee(emp_id)
ON DELETE SET NULL;

这是我用来进行查询的代码:

SELECT m.first_name, s.first_name
FROM employee AS m
INNER JOIN employee AS s
ON m.super_id = s.emp_id;

在我得到的结果之下。 请注意该表有两个问题。 首先,每一行似乎都是重复的(大卫出现在两行中)。 二、emp_id与sup_id不匹配(根据ON m.super_id = s.emp_id)。

|emp_id | first_name |
----------------------
|David  | David      |
|David  | David      |
|Rick   | Rick       |
|Rick   | Rick       |

有人可以帮我吗? 谢谢

【问题讨论】:

    标签: sql popsql


    【解决方案1】:

    如果需要获取所有记录(包括 Dave),则需要使用 OUTER JOIN

    SELECT m.first_name AS EmployeeName, 
    s.first_name AS SupervisorName
    FROM employee AS m
    LEFT JOIN employee AS s
    ON m.super_id = s.emp_id;
    

    【讨论】:

    • 谢谢!这段代码似乎有效。我现在对某事感到惊讶。我不知道如何正确添加跟进。我无法在这个小评论框中添加代码块,哈哈。为什么如果我不将 SELECT 与“AS”一起使用,则自连接似乎不起作用?
    • 内连接只检索匹配的行(ON m.super_id = s.emp_id)。在您的数据中,Dave 没有 super_id,因此它与内部联接不匹配
    • AS 关键字仅用于别名,您不必使用它。 LEFT JOIN 是这里的魔力。
    • 我得到了 LEFT JOIN 的用法。完全有道理。谢谢。但是,如果我采用您提到的代码并删除“AS EmployeeName”和“AS SupervisorName”,结果会发生根本变化。结果只会显示 NULL | NULL -- 大卫 |大卫等...为什么会这样?
    • 我相信我现在可以将它作为一个单独的问题重新发布,因为我们正在研究为什么“AS”会改变查询结果。感谢您的帮助!
    【解决方案2】:
    SELECT m.first_name, s.first_name
    FROM employee AS m
    left JOIN employee AS s
    ON m.super_id = s.emp_id;
    

    【讨论】:

    • 完全按照需要工作。请参阅 mehmetx 答案的跟进。
    • 我没有使用 emplyeename 或 supervisorname 作为别名返回错误的结果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多