简体   繁体   English

#SQL UNION两个WITH SELECT

[英]#SQL UNION two WITH SELECT

I am trying to make a UNION of two SELECT statements make it with WITH, 我试图使两个SELECT语句的UNION与WITH一起使用,

the selects are a recursive search of the managers and a recursive search of all the subordinates of a manager, If a EmployeeNumber has Managers like subordinates only this are mapped and not the subordinates of this managers, but if it has subordinates that are not managers, they and a recursive search of all the subordinates get mapped. 选择是对经理的递归搜索和对经理的所有下属的递归搜索,如果EmployeeNumber具有像下属这样的Manager,则仅映射此对象而不是此经理的下属,但是如果它的下属不是经理,他们和所有下属的递归搜索被映射。

The JobCode table has the codes of the Managers JobCode表具有管理者的代码

The query is for example: 该查询例如:

DECLARE @EmployeeNumber VARCHAR(10) = '1035423';

 WITH EmpCTE (Id, 
              Name, 
              Email, 
              EmployeeNumber, 
              Login, 
              Status, 
              SupervisorNumber, 
              Shift, 
              CostCenter, 
              JobCode)
   AS (SELECT Id,
              Name,
              Email,
              EmployeeNumber,
              Login,
              Status,
              SupervisorNumber,
              Shift,
              CostCenter,
              JobCode
         FROM dbo.Employees
        WHERE EmployeeNumber = @EmployeeNumber
    UNION ALL
       SELECT e.Id,
              e.Name,
              e.Email,
              e.EmployeeNumber,
              e.Login,
              e.Status,
              e.SupervisorNumber,
              e.Shift,
              e.CostCenter,
              e.JobCode
         FROM dbo.Employees AS e
         JOIN EmpCTE AS m
           ON (e.SupervisorNumber = m.EmployeeNumber 
          AND e.JobCode IN  (SELECT Id FROM dbo.JobCodes)))
       SELECT *
         FROM EmpCTE
        UNION

WITH EmpCTE2 (Id, 
              Name, 
              Email, 
              EmployeeNumber, 
              Login, 
              Status, 
              SupervisorNumber, 
              Shift, 
              CostCenter, 
              JobCode)
   AS (SELECT Id,
              Name,
              Email,
              EmployeeNumber,
              Login,
              Status,
              SupervisorNumber,
              Shift,
              CostCenter,
              JobCode
         FROM dbo.Employees
        WHERE EmployeeNumber = @EmployeeNumber
    UNION ALL
       SELECT e.Id,
              e.Name,
              e.Email,
              e.EmployeeNumber,
              e.Login,
              e.Status,
              e.SupervisorNumber,
              e.Shift,
              e.CostCenter,
              e.JobCode
         FROM dbo.Employees AS e
         JOIN EmpCTE2 AS m
           ON (e.SupervisorNumber = m.EmployeeNumber 
          AND e.JobCode NOT IN (SELECT Id FROM dbo.JobCodes)))
       SELECT *
         FROM EmpCTE2;

Someone knows how to perform it or another way to perform this select WITHOUT the use of pointers 有人知道如何执行它,或者执行另一种选择方法而无需使用指针

You have to put ALL your CTE's at the top, and then you can use them in your full SELECT: 您必须将所有CTE放在顶部,然后才能在完整的SELECT中使用它们:

WITH cte1 AS (...)
,   cte2 AS (...)
SELECT...FROM cte1
UNION 
SELECT...FROM cte2

Or you can do this in one recursive cte like below 或者您可以像下面这样在一个递归cte中执行此操作

DECLARE @EmployeeNumber VARCHAR(10) = '1035423';

WITH EmpCTE (Id, Name, Email, EmployeeNumber, Login, Status, SupervisorNumber, Shift, CostCenter, JobCode,stop)
AS (
SELECT Id,
       Name,
       Email,
       EmployeeNumber,
       Login,
       Status,
       SupervisorNumber,
       Shift,
       CostCenter,
       JobCode,
       stop=null
    FROM dbo.Employees
    WHERE EmployeeNumber = @EmployeeNumber
    UNION ALL
    SELECT e.Id,
           e.Name,
           e.Email,
           e.EmployeeNumber,
           e.Login,
           e.Status,
           e.SupervisorNumber,
           e.Shift,
           e.CostCenter,
           e.JobCode,
           stop= case when e.JobCode IN (SELECT Id FROM dbo.JobCodes) then 1 else NULL end
    FROM dbo.Employees AS e
        JOIN EmpCTE AS m
            ON (e.SupervisorNumber = m.EmployeeNumber)
            AND (m.Stop is null )
)
SELECT Id, Name, Email, EmployeeNumber, Login, Status, SupervisorNumber, Shift, CostCenter, JobCode
FROM EmpCTE

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM