在Order by之后重置标识列值

时间:2013-07-05 09:38:47

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

我有一个带有Rownum标识列的临时表#jobs。

Rownum  Jobid   Jobname
    1   5074    Manager 
    2   780     Manager 
    3   71      Employee    
    4   654     HR  
    5   94      Employee    
    6   56      Employee
    7   35      Manager 
    8   81      HR  
    9   358     Employee    

现在,我在“Jobname”栏目中有排序条件

Rownum  Jobid   Jobname
    1   5074    Manager 
    2   780     Manager
    7   35      Manager 
    8   81      HR         
    4   654     HR  
    5   94      Employee    
    6   56      Employee
    9   358     Employee    

我的要求是每当我对表格进行排序时,都应重置Rownum列。根据我的顺序,我需要增加rownum值。

我试过以下

  ALTER TABLE #Jobs DROP COLUMN RowNum //droping identity column from #jobs
    SELECT * INTO #tempjob FROM #jobs //inserting #jobs rows into another temp table
    TRUNCATE TABLE #Jobs //truncating all rows from #jobs
    ALTER TABLE #Jobs ADD RowNum INT //create a new column without increment

//now inserting records from #tempjobs to #jobs with ROW_NUMBER()
    INSERT INTO #Jobs
    SELECT *,ROW_NUMBER() OVER(ORDER BY Jobname DESC) AS Rownum from #tempjob

我认为这很好,但是当一个临时表中存在大量记录时,我认为使用具有相同数据的另一个临时表并不好。

有没有替代解决方案?

2 个答案:

答案 0 :(得分:0)

我建议采用一种更简单的方法。试试这个

CREATE TABLE TEMP AS SELECT * FROM JOBS;
DROP TABLE JOBS;
CREATE TABLE JOBS AS
SELECT ROW_NUMBER() OVER (ORDER BY JOBNAME) ROWNUM,JOBID,JOBNAME FROM TEMP;

当您反复更改表格时,这将是一个开销。 我不是说它的操作效率很高,但它会比你现在所做的更有效率。 请试一试。

答案 1 :(得分:0)

一种简单的方法是简单地更新表格rownum

UPDATE #Jobs
SET RowNum= ROW_NUMBER() OVER(ORDER BY Jobname DESC)