2010-08-26 50 views
2

我有一个存储过程,它自己正常工作。最近的一项要求让我觉得Union查询将会完成我所需要的。这是工作版本。它使用ROW_NUMBER()来实现分页和排序正确Tsql联合查询正在打破我的asp.net gridview排序

SELECT x.TicketID, 
x.TicketNumber, 
x.AccountID, 
x.SkillID 
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY 
    CASE WHEN @ipv_SortExpression = 'TicketNumber' AND @ipv_SortDirection = 'ASC' THEN y.TicketNumber END ASC, 
    CASE WHEN @ipv_SortExpression = 'TicketNumber' AND @ipv_SortDirection = 'DESC' THEN y.TicketNumber END DESC,    
    CASE WHEN @ipv_SortExpression = 'AccountNumber' AND @ipv_SortDirection = 'ASC' THEN y.AccountNumber END ASC, 
    CASE WHEN @ipv_SortExpression = 'AccountNumber' AND @ipv_SortDirection = 'DESC' THEN y.AccountNumber END DESC,    
    CASE WHEN @ipv_SortExpression = 'OpenDate' AND @ipv_SortDirection = 'ASC' THEN y.OpenDate END ASC, 
    CASE WHEN @ipv_SortExpression = 'OpenDate' AND @ipv_SortDirection = 'DESC' THEN y.OpenDate END DESC       ) AS RowNumber, 
y.TicketID, 
y.TicketNumber, 
y.AccountID, 
y.SkillID 
FROM (SELECT 
    t.TicketID, 
    t.TicketNumber, 
    t.AccountID, 
    t.SkillID FROM someTable t) AS y 

) AS x WHERE x.RowNumber BETWEEN @startIdx AND @endIdx 

请注意我ommitted某些领域,缩短查询。这可以正常工作,并且在调用该过程时,结果集将返回正确排序。现在我需要向结果集添加一条附加记录。我尝试了联合查询,但由于某些原因,它打破了排序,结果集总是以相同的顺序返回...

SELECT x.TicketID, 
x.TicketNumber, 
x.AccountID, 
x.SkillID 
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY 
    CASE WHEN @ipv_SortExpression = 'TicketNumber' AND @ipv_SortDirection = 'ASC' THEN y.TicketNumber END ASC, 
    CASE WHEN @ipv_SortExpression = 'TicketNumber' AND @ipv_SortDirection = 'DESC' THEN y.TicketNumber END DESC,    
    CASE WHEN @ipv_SortExpression = 'AccountNumber' AND @ipv_SortDirection = 'ASC' THEN y.AccountNumber END ASC, 
    CASE WHEN @ipv_SortExpression = 'AccountNumber' AND @ipv_SortDirection = 'DESC' THEN y.AccountNumber END DESC,    
    CASE WHEN @ipv_SortExpression = 'OpenDate' AND @ipv_SortDirection = 'ASC' THEN y.OpenDate END ASC, 
    CASE WHEN @ipv_SortExpression = 'OpenDate' AND @ipv_SortDirection = 'DESC' THEN y.OpenDate END DESC       ) AS RowNumber, 
y.TicketID, 
y.TicketNumber, 
y.AccountID, 
y.SkillID 
FROM (SELECT 
    t.TicketID, 
    t.TicketNumber, 
    t.AccountID, 
    t.SkillID FROM someTable t) AS y 

) AS x WHERE x.RowNumber BETWEEN @startIdx AND @endIdx 
    UNION 
SELECT 
    z.TicketID 
    z.TicketNumber 
    z.AccountID 
    z.SkillID 
FROM (

SELECT TOP 1 
    tix.biTicketID as TicketID 
    , tix.vcTicketID as TicketNumber 
    , tix.biAccountID as AccountID 
    , tix.siSkillID as SkillID 
FROM someOtherTable tix ORDER BY tix.ActionDate) As z 

此查询断裂排序我的网格。这就像程序完全忽略了我传入的排序标准。我试图先放置较小的查询,然后联合较大的查询,但仍然没有运气。任何人都可以看到我做错了什么,或者我可以如何补救?客户想要这个新功能,但他们不想牺牲排序。我如何正确完成我的任务?感谢任何建议或提示的一堆。

欢呼声中,在圣地亚哥

回答

6

〜CK你需要一个ORDER BY对整个结果,如果你想要的结果进行排序集合。

(Query A) 
UNION 
(Query B) 
ORDER BY xxx 
+1

是的,ORDER BY RowNumber是所有需要在这里结束 – SQLMenace 2010-08-26 20:44:40

+0

是的,顺序rownumber似乎很好地工作。谢谢一堆! – Hcabnettek 2010-08-26 21:06:08