在一次查询中查询同一个表两次以获得2条记录

时间:2016-05-09 16:10:32

标签: sql sql-server select

我正在使用SQL Server 2016,但这不是2016年的问题。这就是我想做的事情。我将拥有用户的电子邮件地址,并需要为该用户获取数据。所以这很简单:

select [firstname],[lastname],[managerid] from employees where workemail='emp@company.com'

很直接,但请注意我拉着经理的身份。而且我现在需要为经理提供完全相同的数据,没有经理的身份:

select [firstname],[lastname] from employees where mamangerid=manager_id_from_employee_query

您可以看到所有数据都在同一个表中。我可以在这里停下来,因为我有我的数据,但我喜欢学习并寻找更好的解决方案。如何在不必编写2个单独的SQL语句或什么是更好的解决方案的情况下实现我想要做的事情?

3 个答案:

答案 0 :(得分:5)

您可以进行左连接。左侧表达式将包含员工,右侧将链接到同一表中的一行并获取经理的信息(假设它存在)。不要进行内部联接,因为如果"经理"行丢失了,那么你就不会为员工得到任何东西。

Select  [e].[firstname] [emp_fname]
  , [e].[lastname] [emp_lname]
  , Manager.[firstname] [mgr_fname]
  , Manager.[lastname] [mgr_lname]
From    [employees] [e]
    Left Join [employees] Manager
        On [e].[employee_id] = Manager.[managerid]

答案 1 :(得分:2)

您可以使用自我联接,其中表的第一个实例表示员工的详细信息,第二个表示经理的详细信息:

SELECT    e.[firstname], e.[lastname], m.[firstname], m.[lastname]
FROM      employees e
LEFT JOIN employees m ON e.[managerid] = m.[id]
WHERE     e.workemail = 'emp@company.com'

答案 2 :(得分:1)

这应该会给你正确的结果:

SELECT a.firstname, a.lastname FROM employees a RIGHT JOIN 
  (SELECT managerid FROM employees WHERE workemail = 'emp@company.com') b 
WHERE a.managerid = b.managerid