【问题标题】:Using order by clause with UNION issue使用带有 UNION 问题的 order by 子句
【发布时间】:2015-10-12 12:02:55
【问题描述】:

当我使用 UNION 使用 Order by 时出现以下错误。

“ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML。”

declare @results table (hdate date, name varchar(100), id1 int)

insert into @results select cast('10-01-2015' as date), 'val1 1', 1
insert into @results select cast('10-02-2015' as date), 'val2 2', 2

insert into @results select cast('10-03-2015' as date), 'thanks 1', 3
insert into @results select cast('10-04-2015' as date), 'thanks 2', 3

select  (DATENAME(dw, hdate) + ', ' + 
        DATENAME(mm, hdate) + ' '  + 
      DATENAME(dd, hdate)) AS h_date, name AS h_name from @results where id1 in (1,2) 
order by id1
UNION
SELECT (STUFF((
        SELECT ', ' + (DATENAME(dw, hdate) + ', ' + 
       DATENAME(mm, hdate) + ' '  + 
       DATENAME(dd, hdate))
        FROM @results
        WHERE id1 = 3
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS h_date, 'Giving Day' AS h_name

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您可以尝试以下方法:

    declare @results table (hdate date, name varchar(100), id1 int)
    
    insert into @results select cast('10-01-2015' as date), 'val1 1', 1
    insert into @results select cast('10-02-2015' as date), 'val2 2', 2
    
    insert into @results select cast('10-03-2015' as date), 'thanks 1', 3
    insert into @results select cast('10-04-2015' as date), 'thanks 2', 3
    
    SELECT  id1,
            (DATENAME(dw, hdate) + ', ' + 
            DATENAME(mm, hdate) + ' '  + 
            DATENAME(dd, hdate)) AS h_date, name AS h_name from @results where id1 in (1,2) 
    
    UNION
    
    SELECT DISTINCT id1,(STUFF((
            SELECT ', ' + (DATENAME(dw, hdate) + ', ' + 
                   DATENAME(mm, hdate) + ' '  + 
                   DATENAME(dd, hdate))
            FROM @results r2
            WHERE  r1.id1 = r2.id1
            FOR XML PATH('')
            ), 1, 2, '')
        ) AS h_date, 'Giving Day' AS h_name
    FROM @results r1
    WHERE id1 = 3 
    ORDER BY id1
    

    【讨论】:

      【解决方案2】:

      正如错误所示,您不能将 ORDER BY 与 UNION 一起使用。因此,您必须在订购之前将其包装在子查询中:

      select h_date, h_name from (
      select  (DATENAME(dw, hdate) + ', ' + 
              DATENAME(mm, hdate) + ' '  + 
            DATENAME(dd, hdate)) AS h_date, name AS h_name 
            , id1
            from @results 
            where id1 in (1,2) 
      UNION
      SELECT (STUFF((
              SELECT ', ' + (DATENAME(dw, hdate) + ', ' + 
             DATENAME(mm, hdate) + ' '  + 
             DATENAME(dd, hdate))
              FROM @results
              WHERE id1 = 3
              FOR XML PATH('')
              ), 1, 2, '')
          ) AS h_date, 'Giving Day' AS h_name, 3 as id1) q
      order by id1
      

      【讨论】:

        【解决方案3】:

        这也有效:

        declare @results table (hdate date, name varchar(100), id1 int)
        
        insert into @results select cast('10-01-2015' as date), 'val1 1', 1
        insert into @results select cast('10-02-2015' as date), 'val2 2', 2
        
        insert into @results select cast('10-03-2015' as date), 'thanks 1', 3
        insert into @results select cast('10-04-2015' as date), 'thanks 2', 3
        
        select * FROM ( SELECT TOP 100 PERCENT (DATENAME(dw, hdate) + ', ' + 
                DATENAME(mm, hdate) + ' '  + 
              DATENAME(dd, hdate)) AS h_date, name AS h_name from @results where id1 in (1,2) 
        ORDER BY id1)A
        UNION 
        select * FROM ( SELECT TOP 100 PERCENT (STUFF((
                SELECT ', ' + (DATENAME(dw, hdate) + ', ' + 
               DATENAME(mm, hdate) + ' '  + 
               DATENAME(dd, hdate))
                FROM @results
                WHERE id1 = 3
                FOR XML PATH('')
                ), 1, 2, '')
            ) AS h_date, 'Giving Day' AS h_name
            ) AS B
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 2018-03-31
          • 2014-08-03
          • 1970-01-01
          • 2018-11-28
          • 1970-01-01
          相关资源
          最近更新 更多