【问题标题】:Wierd Syntax Error when working with Order By clause with Union All in Toad for Sql Server 2016在 Toad for Sql Server 2016 中使用带有 Union All 的 Order By 子句时出现奇怪的语法错误
【发布时间】:2017-09-07 12:50:03
【问题描述】:

我想要两个结果集的联合。第一组包含工资单已关闭的期间,第二组只有一个有效期间。所以我在第二组中进行排序以按升序推导出活动期。但我总是得到“联合关键字附近的语法不正确”。我无法追踪这周围发生了什么。

SELECT SysId AS PeriodId,
       [Name] AS PeriodName,
       Number AS PeriodNumber,
       [Year] AS PeriodYear,
       PayrollSetId AS PayrollSetId
  FROM (SELECT p.SysId AS PeriodId,
               p.[Name] AS PeriodName,
               p.Number AS PeriodNumber,
               p.[Year] AS PeriodYear,
               p.PayrollSetId AS PayrollSetId
          FROM PeriodPayrollSetLookupView p
         WHERE p.Closed = 1
        UNION ALL
        SELECT TOP 1
               p.SysId AS PeriodId,
               p.[Name] AS PeriodName,
               p.Number AS PeriodNumber,
               p.[Year] AS PeriodYear,
               p.PayrollSetId AS PayrollSetId
          FROM PeriodPayrollSetLookupView p
         WHERE isnull (p.Closed, 0) = 0
        ORDER BY p.[Year], p.[Name]  
        UNION ALL
        SELECT '00000000-0000-0000-0000-000000000000' AS PeriodId,
       '<Select...>' AS PeriodName,
       NULL AS PeriodNumber,
       NULL AS PeriodYear,
       '00000000-0000-0000-0000-000000000000' AS PayrollSetId)AS PERIOD
ORDER BY [Year] DESC, Number DESC

非常感谢您的帮助。

【问题讨论】:

    标签: sql-server sql-order-by union-all


    【解决方案1】:

    您不能在UNION 中使用的选择中使用ORDER BY。你可以用CTE's重写它:

    WITH closed AS (SELECT p.SysId AS periodid,
                       p.[Name] AS periodname,
                       p.Number AS periodnumber,
                       p.[year] AS periodyear,
                       p.PayrollSetId AS payrollsetid
                  FROM PeriodPayrollSetLookupView p
                 WHERE p.closed = 1),
     active AS (SELECT TOP 1
                       p.SysId AS periodid,
                       p.[Name] AS periodname,
                       p.Number AS periodnumber,
                       p.[year] AS periodyear,
                       p.PayrollSetId AS payrollsetid
                  FROM PeriodPayrollSetLookupView p
                 WHERE isnull (p.closed, 0) = 0
                ORDER BY p.[year], p.[name]),
     x AS (SELECT '00000000-0000-0000-0000-000000000000' AS periodid,
                  '<select...>' AS periodname,
                  NULL AS periodnumber,
                  NULL AS periodyear,
                  '00000000-0000-0000-0000-000000000000' AS payrollsetid)
    SELECT *
      FROM (SELECT periodid,
                   periodname,
                   periodnumber,
                   periodyear,
                   payrollsetid
              FROM closed
            UNION ALL
            SELECT periodid,
                   periodname,
                   periodnumber,
                   periodyear,
                   payrollsetid
              FROM active
            UNION ALL
            SELECT periodid,
                   periodname,
                   periodnumber,
                   periodyear,
                   payrollsetid
              FROM x) t
    ORDER BY periodyear DESC, periodnumber DESC
    

    【讨论】:

    • 乐于助人! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-03-31
    • 2016-08-27
    • 2018-11-28
    • 2019-11-24
    相关资源
    最近更新 更多