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
。获得一个精确的计数,以便将其与零进行比较,并不能提高性能。您可以使用外部联接和分组来替换子查询,但我认为这样做不会更清晰或提供更好的性能。我敢问,改变这个问题背后的动机是什么?变更的具体要求是什么,例如,
交叉应用
是否不允许?我不需要计数。我只想要存在。