【问题标题】:Tsql Union Query is breaking sorting in my asp.net gridviewTsql Union Query 在我的 asp.net gridview 中破坏了排序
【发布时间】:2010-08-26 20:35:54
【问题描述】:

我有一个独立运行的存储过程。最近的一项要求使我认为联合查询将完成我所需要的。这是工作版本。它使用 ROW_NUMBER() 来正确完成分页和排序

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 

请注意,我省略了一些字段以缩短查询。这可以按预期正常工作,并且当调用该过程时,返回的结果集已正确排序。现在我需要向结果集中添加一条额外的记录。我尝试了一个联合查询,但由于某种原因它破坏了排序并且结果集总是以相同的顺序返回......

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

此查询中断了我的网格上的排序。这就像该过程完全无视我传入的排序标准。我尝试先放置较小的查询,然后合并较大的查询,但仍然没有运气。那里的任何人都可以看到我做错了什么或者我该如何解决这个问题?客户想要这个新功能,但他们不想牺牲排序。我怎样才能正确完成我的任务?非常感谢您提供任何建议或提示。

干杯, ~ck 在圣地亚哥

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:

    如果您希望对结果进行排序,则需要对整个结果集使用 ORDER BY。

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

    【讨论】:

    • 是的,ORDER BY RowNumber 就是这里最后需要的全部内容
    • 是的,按行号排序似乎效果很好。非常感谢!
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多