【问题标题】:Conditional Join depending on field value?取决于字段值的条件连接?
【发布时间】:2014-04-15 15:07:52
【问题描述】:

我正在为我公司的新系统创建数据库结构。我们基于 Web 的应用程序将我们的多个内部应用程序链接在一起。

在我们的数据库中,我有一个 HR 模式,其中包含一系列表格,其中包含我们公司所有员工的数据。但是,我们还将让另外两家公司访问我们的系统。

现在在员工模式中,我有以下一些表:

employees (houses name, address, etc)
phone_manager (houses multiple phone numbers for each employee, mobile, home, etc.)
email_manager (again multiple emails per employee)

等等,但这些是主要的包含表。

对于其他公司,只有一个表,该表包含每个员工的姓名、电话号码、电子邮件和公司。

我的主要问题是如何在这些表和我的用户表之间建立关系,以便能够枚举所有不同用户的所有有用信息?

包含所有用户的数据表的输出示例

╔═════════════╦══════════════╦═══════════════╦══════════════╦══════════════╗
║ Name        ║ Work Number  ║ Mobile Number ║ Email 1      ║ Email 2      ║
╠═════════════╬══════════════╬═══════════════╬══════════════╬══════════════╣
║ John Doe    ║ 111-555-0123 ║ 123-456-7890  ║ j.d@hp.com   ║ johnd@hp.com ║
║ Jane Doe    ║ 121-545-0123 ║               ║ janed@hp.com ║              ║
║ Michael Joe ║              ║ 123-987-4567  ║              ║ mj@cc.net    ║
╚═════════════╩══════════════╩═══════════════╩══════════════╩══════════════╝

还将有一个公司列,该列来自一个名为 organizations 的表。

【问题讨论】:

标签: sql sql-server database


【解决方案1】:

您应该在员工表中有一个键,该键可以唯一标识员工,例如自动递增编号或您选择的任何其他编号。

如果需要,您可以在电话管理器/电子邮件管理器等其他表格中使用该 EmpID。

请记住,经理也是员工,因此经理 ID 也只能从 Employee 表中派生,您无需为此创建任何新的。

快速浏览 Adventure 作品数据库,您会对此有更深入的了解。

【讨论】:

  • 员工表只处理我自己公司的员工信息。有一个单独的表处理其他公司员工的信息。如果ID为0,我需要确定如何从一个表中获取信息,如果ID为> 0,我需要确定如何从另一个表中获取信息。
  • 您可以在允许的情况下使用 Case 语句或 IF 语句。您可以进行常规连接,但使用 CASE 提取不同的列。
【解决方案2】:

像这样使用LEFT JOIN

SELECT employees.Name,
       phone_manager.Work_Number AS 'Work Number', 
       phone_manager.Mobile_Number AS 'Mobile Number',
       email_manager.Email_1 AS 'Email 1',
       email_manager.Email_2 AS 'Email 2'
FROM employees
LEFT JOIN phone_manager ON phone_manager.employee_id = employees.id
LEFT JOIN email_manager ON email_manager.employee_id = employees.id

编辑要回答评论中的问题,请将以下条件添加到查询末尾:

WHERE employees.id IN(SELECT users.employee_id FROM users
                      WHERE users.company_id IN(1, 2))

或者,您可以使用INNER JOIN 添加用户表:

SELECT employees.Name,
       phone_manager.Work_Number AS 'Work Number', 
       phone_manager.Mobile_Number AS 'Mobile Number',
       email_manager.Email_1 AS 'Email 1',
       email_manager.Email_2 AS 'Email 2'
FROM employees
INNER JOIN users ON users.employee_id = employees.id AND users.company_id IN(1, 2)
LEFT JOIN phone_manager ON phone_manager.employee_id = employees.id
LEFT JOIN email_manager ON email_manager.employee_id = employees.id

【讨论】:

  • 这非常适合吸引我们的员工。但是,例如,在我的 Users 表中,我有两个字段:employee_id、company_id。如果公司 id=1 或 id=2,那么我们需要从 organization_employees 表中获取他们的电子邮件、姓名、电话号码等。
  • 这似乎是朝着正确方向迈出的明确一步。问题将是我的员工表的架构和其他公司员工的架构大不相同。我的员工可以有很多电子邮件,所以我必须选择所有电子邮件,电话号码也是如此。这些电子邮件和号码都存储在单独的表格中。但是,对于其他公司,我的单表包含 2 个号码和 1 个电子邮件,以及员工的信息。所以获取他们信息的查询是不同的。我应该能够将两个选择语句链接在一起并将它们合并
  • @Jdsfighter 是正确的,您可以使用UNIONUNION ALL 来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多