【问题标题】:Join two tables to create a third one sql连接两个表创建第三个 sql
【发布时间】:2018-05-22 18:29:57
【问题描述】:

我有两个表,我想创建第三个连接其他两个表。 我的目的是创建一个 CRUD 应用来切换部门的员工

表员工:

| id | Name | Other |
|----|------|-------|
| 1  | John | x     |
| 2  | Jack | y     |
| 3  | Phil | z     |

餐桌部门:

| id | Name| Zone |
|----|-----|------|
| 1  | WH1 | a    |
| 2  | WH2 | b    |
| 3  | WH3 | c    |

我想创建第三个名为 Situation 的表,其中包含员工姓名、部门名称和区域。

  • 一名员工只能在一个部门工作
  • 一个部门可以包含更多员工,但也可以为零

如何做到这一点? 而且,这是最佳做法吗? 每个员工都经常更换部门。

谢谢

【问题讨论】:

  • 只创建表?没有办法加入这些数据,所以我不知道你打算在创建表格后如何填充表格。如果您必须使用您共享的此示例数据手动填充它,那会是什么样子?如果您在 CREATE 语句中遇到困难,请分享您正在使用的 RDBMS,因为每个产品的语法都不同。
  • 创建一个包含employeeid、department_id、startdate 和enddate 的交叉引用表。然后,当员工在您周围移动时,在表中填充结束日期和新记录,以便您保留历史记录。让您的应用指向记录将使结束日期为空。

标签: sql


【解决方案1】:

跟进我上面的评论:

首先创建交叉引用表

create table employee_dept_cross_ref (employee_id int, department_id int, startdate datetime, enddate datetime)

当员工更改部门时,使用 enddate=null 填充具有该员工 ID 的任何记录的结束日期并插入新映射

update employee_dept_cross_ref set enddate=getdate() where employeeid=@employee_id and departmentid<>@department_id and enddate is null
insert employee_dept_cross_ref
values
(@employee_id, @department_id, getdate(), null)

然后将您的应用指向 enddate 为 null 的映射

【讨论】:

  • 以上假设您通过 UI 传递变量 *employee_id 和 *department_id
【解决方案2】:

由于您的每个员工只有一个部门,最佳做法是在您的 Employees 表中添加一个附加列,该列将引用给定的部门员工。

表员工:

| id | Name | Other | Department_Id
|----|------|-------|--------------
| 1  | John | x     | 1
| 2  | Jack | y     | 1
| 3  | Phil | z     | 2

餐桌部门:

| id | Name| Zone |
|----|-----|------|
| 1  | WH1 | a    |
| 2  | WH2 | b    |
| 3  | WH3 | c    |

现在你做一个JOIN,例如:

SELECT e.id, 
       e.Name, 
       d.Name AS Department_Name, 
       d.zone AS Department_Zone
FROM Employees e JOIN Departments d 
       ON e.Department_Id = d.id

然后你会在同一行看到你的员工和他们的部门:

| id | Name | Department_Name | Department_Zone |
|----|------|-----------------|-----------------|
| 1  | John | WH1             | a               |
| 2  | Jack | WH1             | a               |
| 3  | Phil | WH3             | c               |

要保存此选择的结果,您可以使用SELECT INTO

SELECT e.id, 
       e.Name, 
       d.Name AS Department_Name, 
       d.zone AS Department_Zone
INTO employee_departments
FROM Employees e JOIN Departments d 
       ON e.Department_Id = d.id

这会将所有新创建的信息保存到 employee_departments 表中。

【讨论】:

    【解决方案3】:

    您可以有一个保存员工 ID 和部门 ID 的表格(员工现在正在工作)。然后,您可以创建一个选择加入员工和部门以检索额外信息(如员工姓名或部门区域)。这是最常见的情况。如果您对此有性能问题(我确定没有),您可以包括调整任务(例如名称重复、区域重复,但这在 EmployeeDepartment 更新中最不执行)。

    【讨论】:

    • 另一种选择可能是将部门 ID 字段添加到员工中(如果员工一直在一个部门工作)
    【解决方案4】:

    Employees 表和 Departments 表之间需要存在关系。理想情况下,employees 表中应该有一个 dept_id 列(外键)。这对于将员工与部门相关联是必要的,以便您可以填充名为:SITUATION 的表。如果您不需要存储的数据,您可以简单地创建一个视图。如果Employees表中有一个dept_id,那么编写你的SQL可以这样:

    SELECT E.NAME AS EMPLOYEE_NAME,
           D.NAME AS DEPARTMENT_NAME
    FROM   EMPLOYEES E,
           DEPARTMENTS D
    WHERE  E.DEPT_ID = D.DEPT_ID;
    

    我希望这会有所帮助。

    【讨论】: