簡體   English   中英

MS SQL row_number / rank用於簡單集合枚舉的替代方法

[英]MS SQL row_number/rank alternative for simple set enumeration

我試圖使用row_number或rank只是為了插入行號,以便可以在不使用游標的情況下枚舉臨時表。 這兩個函數都給我錯誤“語法在“行”附近不正確,預期為“ OVER””。 我不需要OVER提供的所有功能和性能影響-我不在乎訂單/排名等。我確定我之前已經做過,但是幾年前,有人可以指出我嗎?正確的功能?

declare @SomeTempTable table (RowNum int NOT NULL, SomeField int NOT NULL);

insert into @SomeTempTable
  select rank() as RowNum, SomeField
  from SomeTable 

declare @RowNum int = 1;
declare @NumRows int = (select max(RowNum) from @SomeTempTable);

while@RowNum <= @NumRows
begin
  declare @SomeField int;

  select @SomeField = SomeField
  from @SomeTempTable
  where RowNum = @RowNum;

  --TODO: Do stuff  

  set @RowNum = @RowNum + 1;               
END

嗯,即使它很吸引人,您也不必決定SQL函數的語法。

有兩種獲取所需內容的方法。 第一種是標准方法,根本不使用Windows函數:

declare @SomeTempTable table (
    RowNum int identity(1,1) not null,
    SomeField int NOT NULL
);

insert into @SomeTempTable(SomeField)
     select SomeField
     from SomeTable 

瞧! 讓身份完成工作。

第二種是您采用的方法:

insert into @SomeTempTable(RowNum, SomeField)
    select row_number() over (order by (select NULL)) as RowNum, SomeField
    from SomeTable 

在SQL Server中,“按...排序(選擇NULL)”似乎是一種神奇的咒語,它只分配數字,而不實際進行排序。

順便說一句,當您執行插入操作時,應始終在插入語句中指定列。

同樣,很可能WHILE循環可以被重寫為查詢,從而使所有工作效率更高(並非總是如此,但有時)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM