Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自行加入以获取员工经理姓名_Sql_Sql Server_Database_Tsql - Fatal编程技术网

Sql 自行加入以获取员工经理姓名

Sql 自行加入以获取员工经理姓名,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,您好,我有一个包含以下列的Employee表 Emp_id, Emp_Name and Mgr_id. 我正在尝试创建一个视图,该视图将列出 Emp\u id、Emp\u name、Mgr\u id和Mgr\u name(通过交叉加入Employee表)。我尝试了外部连接,内部连接等,但我不能得到它的权利 非常感谢您的帮助 CREATE TABLE [dbo].[tblEmployeeDetails]( [emp_id] [bigint] NOT NULL, [emp_name] [nvar

您好,我有一个包含以下列的Employee表

Emp_id, Emp_Name and Mgr_id.
我正在尝试创建一个视图,该视图将列出

Emp\u id、Emp\u name、Mgr\u id和Mgr\u name(通过交叉加入Employee表)。我尝试了外部连接,内部连接等,但我不能得到它的权利

非常感谢您的帮助

CREATE TABLE [dbo].[tblEmployeeDetails](
[emp_id] [bigint] NOT NULL, 
[emp_name] [nvarchar](200) NULL,    
[emp_mgr_id] [bigint] NULL, CONSTRAINT [PK_tblEmployeeDetails] PRIMARY KEY CLUSTERED (
[emp_id] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]
试试这个,它本身就是一个连接,以获得经理:)

编辑: 如果emp_mgr_id为空,左连接将起作用

CREATE VIEW AS 
SELECT e1.emp_Id EmployeeId, e1.emp_name EmployeeName,  
       e1.emp_mgr_id ManagerId, e2.emp_name AS ManagerName 
FROM   tblEmployeeDetails e1 
       LEFT JOIN tblEmployeeDetails e2 
       ON e1.emp_mgr_id = e2.emp_id

正如Jesse所说,使用自连接:

SELECT 
  e.emp_id
  , e.emp_name
  , e.emp_mgr_id
  , m.emp_name AS mgr_name 
FROM [dbo].[tblEmployeeDetails] e 
LEFT JOIN [dbo].[tblEmployeeDetails] m ON e.emp_mgr_id = m.emp_id
试试这个

SELECT Employee.emp_id, Employee.emp_name,Manager.emp_id as Mgr_Id, Manager.emp_name as Mgr_Name 
FROM tblEmployeeDetails Employee 
LEFT JOIN tblEmployeeDetails Manager ON Employee.emp_mgr_id = Manager.emp_id
此定义使用左外部联接,这意味着即使经理ID为NULL或经理已被删除(如果应用程序允许)的员工也将被列出,其经理属性返回为NULL


如果改为使用内部联接,则只会列出拥有管理者的人员。

尝试此操作。.您应该执行
左联接
以在表中保留空值

SELECT a.emp_Id EmployeeId, a.emp_name EmployeeName,  
       a.emp_mgr_id ManagerId, b.emp_name AS ManagerName 
FROM   tblEmployeeDetails a 
       LEFT JOIN tblEmployeeDetails b
       ON b.emp_mgr_id = b.emp_id

此外,您可能希望让经理及其报告与-

SELECT e2.ename ,count(e1.ename)  FROM employee_s e1 LEFT OUTER JOIN employee_s e2 
ON e1.manager_id = e2.eid
group by e2.ename;
*下面是链接到SQLFiddle的一个工作示例。

在课堂笔记中回顾“自我加入”的内容,请更新您的问题并提供完整的细节。我们似乎需要猜测您的要求。请提供更多信息,否则我们都会浪费时间。当mgr_id为空时,此查询将不起作用。Left join也不适用于我。由于我有少数情况下,emp IDE中不存在mgr_id。左外部联接或右外部联接应该可以工作,如果不存在,则我们缺少一些设置。很抱歉,使用外部联接可以正常工作。我的join语句错误(而不是e1.emp\U mgr\U id=e2.emp\U id在e1.emp\U id=e2.emp\U mgr\U id上的e1.emp\U id)。当mgr\U id为空时,此查询将不起作用。左join也不适用于我。由于emp_idI中不存在mgr_id的情况很少,很抱歉,它与外部联接一起工作正常。我的join语句错误(而不是e1.emp\U mgr\U id=e2.emp\U id我在e1.emp\U id=e2.emp\U mgr\U id上的e1.emp\U id)。当mgr\U id为空时,此查询将不起作用。然后您只需执行左连接即可:)左连接对我也不起作用。因为我有少数情况下经理id不存在于emp_idyeah中,所以我尝试了这个方法,但是我有少数情况下经理id不存在于emp_id中,并且失败了。如果经理id不存在,它会将null作为经理id。你希望用什么来代替它?请举一些例子。很抱歉,它与外部连接工作正常。我的join语句错误(而不是e1.emp\U mgr\U id=e2.emp\U id我在e1.emp\U id=e2.emp\U mgr\U id上的e1.emp\U id)是的,我尝试过这个,但我有少数情况下,mgr\U id在emp\U id中不存在,并且失败。即使mgr\U id为null或不存在,它也应该工作。如果mgrId不正确/null。它将为Mgr\u Id和Mgr\u Name提供空值。很抱歉,它与外部联接一起工作正常。我的join语句错误(而不是Employee.emp\u mgr\u id=Manager.emp\u id我有Employee.emp\u id=Manager.emp\u mgr\u id)为什么我们从e1而不是从e2获取mgr\u id。
SELECT Employee.emp_id, Employee.emp_name,Manager.emp_id as Mgr_Id, Manager.emp_name as Mgr_Name 
FROM tblEmployeeDetails Employee 
LEFT JOIN tblEmployeeDetails Manager ON Employee.emp_mgr_id = Manager.emp_id
CREATE VIEW EmployeeWithManager AS 
SELECT e.[emp id], e.[emp name], m.[emp id], m.[emp name] 
FROM Employee e LEFT JOIN Employee m ON e.[emp mgr id] = m.[emp id]
SELECT a.emp_Id EmployeeId, a.emp_name EmployeeName,  
       a.emp_mgr_id ManagerId, b.emp_name AS ManagerName 
FROM   tblEmployeeDetails a 
       LEFT JOIN tblEmployeeDetails b
       ON b.emp_mgr_id = b.emp_id
create view as 
(select 
e1.empno as PersonID,
e1.ename as PersonName,
e2.empno MANAGER_ID,
e2.ename MANAGER_NAME 
from 
employees e1 , employees e2 
where 
e2.empno=e1.mgr)
SELECT e1.empno EmployeeId, e1.ename EmployeeName, 
       e1.mgr ManagerId, e2.ename AS ManagerName
FROM   emp e1, emp e2
       where e1.mgr = e2.empno
select E1.EmpId,E1.Name,E2.Name as Manager from Employee E1 left join Employee E2 on  E1.ManagerID = E2.EmpId
TableName :Manager

EmpId   EmpName     ManagerId
1       Monib       4

2       zahir       1

3       Sarfudding  NULL

4       Aslam       3


select e.EmpId as EmployeeId,e.EmpName as EmployeeName,e.ManagerId as ManagerId,e1.EmpName as Managername from Manager e
  join manager e1 on e.ManagerId=e1.empId
SELECT e2.ename ,count(e1.ename)  FROM employee_s e1 LEFT OUTER JOIN employee_s e2 
ON e1.manager_id = e2.eid
group by e2.ename;
create table abc(emp_ID int, manager varchar(20) , manager_id int)

emp_ID  manager manager_id
1       abc     NULL
2       def     1
3       ghi     2
4       klm     3
5       def1    1
6       ghi1    2
7       klm1    3

select a.emp_ID , a.manager emp_name,b.manager manager_name
from abc a
left join abc b
on a.manager_id = b.emp_ID

Result:
emp_ID  emp_name  manager_name
1       abc       NULL
2       def       abc
3       ghi       def
4       klm       ghi
5       def1      abc
6       ghi1      def
7       klm1      ghi
SELECT e1.emp_id, e1.emp_name, e1.mgr_id, e2.emp_name as manager_name

FROM employee e1

JOIN employee e2

ON e1.mgr_id = e2.emp_id

ORDER BY e1.emp_id