2013-05-31 31 views
1

我不太了解OVER,我想澄清这是什么,我认为它。SQL - OVER和ORDERBY

如果我有一个提供排序类型,记录状态,以及会议日期:

我想通过MeetingDate默认排序。 我想按排序类型为2时的状态排序,,然后按会议日期排序。

下面的代码是否做到这一点?我的测试表明它确实如此,但我可能错过了一些东西。

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

更具体地说,如果@SortType为1所做的就是适当相信代码分解为:

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

我想这可能会打破只是:

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

与(当@SortType为2时相反):

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      Foo.FK_Status ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 

回答

2

CASE @SortType WHEN 2 THEN Foo.FK_Status END相当于CASE @SortType WHEN 2 THEN Foo.FK_Status ELSE NULL END。换句话说,如果@SortType = 1,则该查询实际上是这样的:

SELECT Foo.*, 
    ROW_NUMBER() OVER (
     ORDER BY 
      NULL ASC, 
      Foo.MeetingDate DESC 
    ) AS RowOrder 
1

RowOrder柱将在描述的序列,但没有在该查询的末尾的order by子句,没有保证行将按什么顺序排序。

所以:

SELECT Foo.*, 
     ROW_NUMBER() OVER (ORDER BY 
          CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, 
          Foo.MeetingDate DESC) AS RowOrder 
FROM Foo; 

- 可以以任何顺序出现,而:

SELECT Foo.* 
FROM Foo 
ORDER BY CASE @SortType WHEN 2 THEN Foo.FK_Status END ASC, Foo.MeetingDate DESC; 

- 将命令中所描述的排序顺序的输出(不包括RowOrder列)。