条件加入取决于字段值?

时间:2014-04-15 15:07:52

标签: sql sql-server database

我正在为公司的新系统创建数据库结构。我们基于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    ║
╚═════════════╩══════════════╩═══════════════╩══════════════╩══════════════╝

还有一个公司专栏,该专栏来自一个名为organization的表。

2 个答案:

答案 0 :(得分:1)

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

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

请记住,经理也是一名员工,因此经理ID也只能从员工表中派生出来,您不需要为此创建任何新员工。

快速浏览一下冒险作品数据库,这可以让您更深入地了解这一点。

答案 1 :(得分:0)

像这样使用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添加users表:

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