对单个查询使用带有ORDER BY的UNION子句

时间:2012-04-23 04:28:18

标签: sql sql-server-2008

我有一个包含这样数据的表格。

Id       PId         Device             Status          Type      Created_Date
===      ===         ======             ======          ====      ============
1         2           1                  today          High      2012-04-12 08:11:51.583
2         2           4                  today          Medium    2012-04-02 01:39:52.393
3         3           5                  today          Medium    2012-04-02 01:10:02.443
4         2           6                  today          High      2012-04-02 01:05:25.063
5         2           3                  today          High      2012-04-02 01:03:08.360
6         2           7                  today          High      2012-04-02 01:02:57.093
7         2           2                  today          High      2012-04-02 00:22:37.807

现在,我希望设备6和7的记录始终位于记录集的顶部,并按创建日期的降序排列。并且在设备类型6和7的记录之后,按类型和创建日期降序排除6和7之外的设备记录。

所以期望的结果如下:

Id       PId         Device             Status          Type      Created_Date
===      ===         ======             ======          ====      ============
4         2           6                  today          High      2012-04-02 01:05:25.063
6         2           7                  today          High      2012-04-02 01:02:57.093
1         2           1                  today          High      2012-04-12 08:11:51.583
5         2           3                  today          High      2012-04-02 01:03:08.360
7         2           2                  today          High      2012-04-02 00:22:37.807
2         2           4                  today          Medium    2012-04-02 01:39:52.393

我使用了以下查询:

select * from TblAlert where PId=2 and ( Device=6 OR Device=7) and ( Status='Today' or Status=0)
UNION
Select * from TblAlert Where  PId=2 and ( Device<>6 OR Device<>7)and (Status='Today' or Status=0)
order by Type,Created_Date desc 

但它不起作用,因为它在整个记录集上应用order by子句。

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:4)

select *
from TblAlert 
where PId=2 and ([Status]='Today' or [Status]='0')
order by case when Device in (6, 7) then 0 else 1 end,
         case when Device in (6, 7) then [Type] else '' end,
         Created_Date

答案 1 :(得分:0)

使用Table变量

解决了我自己的问题
DECLARE @Records TABLE
(
   Id  int,
   PId int,
   Device int,
   Status Alert_Type varchar(10),
   Type Alert_Type varchar(5), 
   Created_Date DateTime
); 

INSERT @Records 
    SELECT Id, PId, Device, Status,Type,Created_Date FROM 
        TblAlert 
    WHERE 
        PId =2
        AND Device IN (6,7) 
        AND ( Status='Today' or Status=0) 
    ORDER BY 
        Created_Date DESC; 

INSERT @Records 
    SELECT Id, PId, Device, Status,Type,Created_Date FROM 
        TblAlert 
    WHERE 
        PId =2
        AND Device NOT IN (6,7) 
        AND ( Status='Today' or Status=0) 
    ORDER BY 
        Type, Created_Date DESC; 

SELECT * FROM @Records;