Tsql 如何合并此查询

Tsql 如何合并此查询,tsql,Tsql,我认为这可能会做到(我也让它更具可读性): 希望我没有丢失任何信息,也没有一路上把它抄错。它只能正确解析,因此我不确定它是否会返回您想要的内容。请尝试以下操作: WITH LatestJob AS ( SELECT * FROM (SELECT aId ,Position ,StartDate ,Enddate ,Specialization

我认为这可能会做到(我也让它更具可读性):

希望我没有丢失任何信息,也没有一路上把它抄错。它只能正确解析,因此我不确定它是否会返回您想要的内容。

请尝试以下操作:

    WITH LatestJob AS (
    SELECT * FROM
        (SELECT  
            aId 
           ,Position 
           ,StartDate 
           ,Enddate 
           ,SpecializationId
           ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY 
                 (CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END) ASC
                ,CAST(Enddate AS datetime) DESC
            ) AS RN 
        FROM 
            EmploymentDetails ed
        ) E 
    WHERE RN = 1 
    )
    ,EarliestStart AS (
        SELECT 
             aID
            ,SUM(DATEDIFF(YEAR, Startdate, ISNULL(Enddate,GETDATE()))) AS YearsExperience 
        FROM 
            EmploymentDetails 
        GROUP BY 
            aId
    )
    (
    SELECT
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,aps.cId
        ,aps.ApStatusID AS ApplicationStatus
        ,aps.sId AS SpecializationId
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    JOIN 
        ApplicationStatus aps ON aps.aId=u.Id    
    )
UNION ALL
    (
    SELECT 
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    WHERE 
        u.RoleId = 3 
        AND u.UserStatusId = 1
        AND lj.SpecializationId = 38 --@sId
)

您是否尝试过在两个查询之间编写UNION?是的,我尝试过,但在关键字“WITH”附近出现错误MSG 156,级别15,状态1,第26行语法错误。Msg 319,15级,状态1,第26行关键字“with”附近的语法不正确。如果此语句是公共表表达式或xmlnamespaces子句,则前面的语句必须以分号终止。
    WITH LatestJob AS (
    SELECT * FROM
        (SELECT  
            aId 
           ,Position 
           ,StartDate 
           ,Enddate 
           ,SpecializationId
           ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY 
                 (CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END) ASC
                ,CAST(Enddate AS datetime) DESC
            ) AS RN 
        FROM 
            EmploymentDetails ed
        ) E 
    WHERE RN = 1 
    )
    ,EarliestStart AS (
        SELECT 
             aID
            ,SUM(DATEDIFF(YEAR, Startdate, ISNULL(Enddate,GETDATE()))) AS YearsExperience 
        FROM 
            EmploymentDetails 
        GROUP BY 
            aId
    )
    (
    SELECT
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,aps.cId
        ,aps.ApStatusID AS ApplicationStatus
        ,aps.sId AS SpecializationId
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    JOIN 
        ApplicationStatus aps ON aps.aId=u.Id    
    )
UNION ALL
    (
    SELECT 
         u.Id
        ,u.FirstName + ' ' + u.LastName AS NAME
        ,lj.Position AS LatestPosition
        ,YearsExperience
        ,ad.ExpectedSalary
        ,REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
    FROM 
        Users u 
    JOIN 
        LatestJob lj ON u.Id = lj.aid 
    JOIN 
        EarliestStart ye ON ye.aId = u.Id 
    JOIN 
        ApplicantDetails ad ON ad.aId = u.Id
    WHERE 
        u.RoleId = 3 
        AND u.UserStatusId = 1
        AND lj.SpecializationId = 38 --@sId
)
WITH LatestJob AS (
    SELECT * FROM (
        SELECT  
           aId 
           , Position 
           , StartDate 
           ,  Enddate 
           ,SpecializationId
           ,ROW_NUMBER() OVER (PARTITION BY aId ORDER BY  
                     CASE WHEN Enddate IS NULL THEN 0 ELSE 1 END ASC,  
                     (CAST(Enddate as datetime)) DESC) AS RN 
        FROM EmploymentDetails ed) E WHERE RN=1 
    )
), EarliestStart AS (
    SELECT aID, sum(DATEDIFF(YEAR,Startdate, isnull(Enddate,getdate()))) AS YearsExperience 
    FROM EmploymentDetails GROUP BY aId
)

  SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
      , lj.Position AS LatestPosition
      ,aps.cId,aps.ApStatusID as ApplicationStatus,aps.sId as SpecializationId
      ,  YearsExperience
      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
  FROM Users u 
  JOIN LatestJob lj ON u.Id = lj.aid 
  JOIN EarliestStart ye ON ye.aId = u.Id 
  JOIN ApplicantDetails ad ON ad.aId = u.Id
  JOIN ApplicationStatus aps ON aps.aId=u.Id    

  UNION ALL

  SELECT u.Id,u.FirstName + ' ' + u.LastName AS NAME
      , lj.Position AS LatestPosition
      , '' as cId, '' as ApplicationStatus, '' as SpecializationId
      ,  YearsExperience
      , ad.ExpectedSalary, REPLACE(ISNULL(Address1, '') + ', ' + ISNULL(Address2, '') + ', ' + ISNULL(City, ''), ', ,', ',') AS Address
  FROM Users u 
  JOIN LatestJob lj ON u.Id = lj.aid 
  JOIN EarliestStart ye ON ye.aId = u.Id 
  JOIN ApplicantDetails ad ON ad.aId = u.Id
  WHERE u.RoleId=3 
    AND u.UserStatusId=1
    AND lj.SpecializationId=38 --@sId