【发布时间】: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