使用带有UNION问题的order by子句

时间:2015-10-12 12:02:56

标签: sql-server tsql

当我使用UNION命令时,我收到以下错误。

" 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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如错误所示,您无法将UNDER使用ORDER BY。因此,您必须在订购之前将其包装在子查询中:

caffe

答案 2 :(得分:0)

这也有效:

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