2013-07-09 87 views
0

我想排序union声明的一侧,如下面的代码。但是order by只是union声明的一部分,当我使用view作为order by的部分时,这无法对整理中的冲突产生一些错误。那么,我怎样才能通过union声明的一方来订购呢?使用命令的部分联合声明

select Creator 
     , CreateDate 
     , Subject 
    from tblWkfTicket 
    where tblWkfTicket.ID = @tikectID 
union 
    select Creator 
     , CreateDate 
     , '' AS Subject 
    from tblWkfPost 
    where TicketID = @tikectID 
order by tblWkfPost.ID 
     ; 
+1

有没有在其结果是从'UNION'(或'UNION ALL')查询返回的顺序保证*除非*您有一个'ORDER BY'那对*整个*结果集进行排序。 –

回答

1

你必须写一个ORDER BY将适用于整个结果集。假设你真正想要从第一个查询的结果从第二个查询结果之前出现,而对于第二个查询的结果通过ID进行排序,你需要做的是这样的:

select Creator,CreateDate,Subject 
from 
    (
    select Creator 
     , CreateDate 
     , Subject, 
     , 1 as resSet 
     , 0 as ID 
    from tblWkfTicket 
    where tblWkfTicket.ID = @tikectID 
    union all 
    select Creator 
     , CreateDate 
     , '' AS Subject 
     , 2 
     , ID 
    from tblWkfPost 
    where TicketID = @tikectID 
) t 
order by 
resSet, 
ID; 
+0

我知道我可以通过整个工会声明命令,但问题是我想先把票(工会声明的第一部分),然后对票下面的其他帖子进行排序。 – user1066713

+0

@ user1066713 - 是的,这就是我所展示的 - 但是* *有*写'ORDER BY'来排序整个结果集。无法保证(使用'UNION'或'UNION ALL')第一个查询的结果将出现在第二个(或后续)查询的结果之前。它们可能出现在整个结果之后,或可能穿插在整个结果中。 –

+0

你是对的。如果我只是通过工会声明的一部分进行订购,则不能保证产出具有我想要的订单。但为什么你用两个参数(resset和id)来排序这个语句?我想按ID顺序就足够了。 – user1066713

1

select * 
    from (
        select 1 seq 
         , null postid 
         , emb.Creator 
         , emb.CreateDate 
         , emb.Subject 
        from (   
           select Creator 
            , CreateDate 
            , Subject 
           from tblWkfTicket 
           where tblWkfTicket.ID = @tikectID 
         ) emb 
       union all 
        select 2 seq 
         , tblWkfPost.IDpostid 
         , Creator 
         , CreateDate 
         , '' AS Subject 
        from tblWkfPost 
        where TicketID = @tikectID 
     ) 
order by seq 
     , postid 
; 

从而保证您的订购需求

+0

一旦你引入了'seq'(或者在我的回答中,'resSet'),你就知道这两个结果集将会是不同的,所以你可以切换到'UNION ALL'。 –

+0

@Damien_The_Unbeliever:谢谢,你完全正确,我相应地纠正了我的解决方案。 – collapsar