Tsql 在SQL Server 2012中使用联接显示具有不同条件的分层数据
我有两张桌子。在一个表中,我的原始数据和另一个表中的关系如下所示Tsql 在SQL Server 2012中使用联接显示具有不同条件的分层数据,tsql,Tsql,我有两张桌子。在一个表中,我的原始数据和另一个表中的关系如下所示 Declare @Emp table(EmpId int,EmpName Varchar(100),CITY VARCHAR(100),Designation Varchar(100),ReportingManager Int) INSERT INTO @Emp VALUES(1,'Ram','Hyderabad','TL',6) ,(2,'Laxman','Hyderabad','TL',9) ,(3,'Suresh','Ban
Declare @Emp table(EmpId int,EmpName Varchar(100),CITY VARCHAR(100),Designation Varchar(100),ReportingManager Int)
INSERT INTO @Emp
VALUES(1,'Ram','Hyderabad','TL',6)
,(2,'Laxman','Hyderabad','TL',9)
,(3,'Suresh','Bangalore','Officer',6)
,(4,'Rajesh','Bangalore','Officer',9)
,(5,'Lokesh','Delhi','TL',6)
,(6,'Venkatesh','Mumbai','Manager',6)
,(7,'Subbu','Patna','Officer',9)
,(8,'Ravi','Hyderabad','Officer',9)
,(9,'Sai','Hyderabad','Manager',9)
,(10,'Satish','Hyderabad','Officer',6)
DECLARE @EmpRelation TABLE(EmpRelationShipID INT IDENTITY NOT NULL,ReportingTo INT,EmpID INT)
INSERT INTO @EmpRelation
VALUES(1,6)
,(2,9)
,(3,1)
,(4,5)
,(5,6)
,(7,2)
,(8,5)
,(10,1)
- 此处,@Emp表中的ReportingManager列表示如果 报告TL,然后报告TL的ManagerName
- 此处@EmpRelation中的ReportingTo列指明了他是谁 报告(TL或经理)
- 官员向TLs报告,TLs向经理报告
SELECT E.EmpId
,E.EmpName
,CASE
WHEN E.EmpId = E.ReportingManager
THEN 1
ELSE 0
END AS IsManager
,CASE
WHEN EXISTS (
SELECT NULL
FROM @EmpRelation ER
WHERE ER.ReportingTo = E.EmpId
)
THEN 1
ELSE 0
END AS HasSubordinates
,CASE WHEN E.EmpId != ReportingManager THEN 1 ELSE 0 END AS IsSubordinate
FROM @Emp E;
我希望使用连接而不是Case语句中的表来编写查询
我尝试了下面的查询。请建议在性能方面进行任何更正,以查看未来的数据大小
SELECT E.EmpId
,E.EmpName
,CASE
WHEN E.EmpId = E.ReportingManager
THEN 1
ELSE 0
END AS IsManager
,CASE WHEN HasSubordinate>0 THEN 1 ELSE 0 END HasSubordinates
,CASE WHEN E.EmpId != ReportingManager THEN 1 ELSE 0 END AS IsSubordinate
FROM @Emp E
LEFT JOIN (SELECT COUNT(*)HasSubordinate,ReportingTo Reporting FROM @EmpRelation ER GROUP BY ReportingTo)X ON X.Reporting=E.EmpID
谢谢你的帮助
谢谢首先,当您的意思是
存在时,不要使用count
。获得一个精确的计数,以便将其与零进行比较,并不能提高性能。您可以使用外部联接和分组来替换子查询,但我认为这样做不会更清晰或提供更好的性能。我敢问,改变这个问题背后的动机是什么?变更的具体要求是什么,例如,交叉应用
是否不允许?我不需要计数。我只希望存在。首先,当您的意思是存在时,不要使用count
。获得一个精确的计数,以便将其与零进行比较,并不能提高性能。您可以使用外部联接和分组来替换子查询,但我认为这样做不会更清晰或提供更好的性能。我敢问,改变这个问题背后的动机是什么?变更的具体要求是什么,例如,交叉应用
是否不允许?我不需要计数。我只想要存在。