2016-01-07 49 views
1

我有一張表格,我正在添加一個新列以指示行號。此表沒有關聯任何主鍵,因此我不確定如何使用行號值填充它。在沒有主鍵的表格的新列上填充行號

這是我在CTE中放置的代碼,但在主表中我不知道如何關聯Id列。 Id是我需要開始編號的新添加的列。

;with CTE_RowNum as (
    select 
     ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowId 
     ,Id 
    from dbo.Test 
) 

我可以分區上某些列的表,但我怎麼會加入與原始表這樣的標準是什麼?


編輯 - 這是我所指的模式。 Id是我想用行號填充的新添加的列。名稱和錯誤列一起形成唯一性。

預計產出將是 -

1,ABC,Time Out Issue 
2,ABC,Page Not Found 
3,DEF,Page Not Found 

的順序並不重要,我的意思是最後一排可以有「1」,其他一些其他的價值。

另一種方式我可以考慮將數據重新填充到插入了Identity的新表中,但只是想知道是否有辦法通過T-SQL來實現?

CREATE TABLE #Test 
(
    Id INT 
    ,Name NVARCHAR(100) 
    ,Error NVARCHAR(100) 

) 

INSERT INTO #Test (Name,Error) VALUES 
    ('ABC','Time Out Issue') 
    ,('ABC','Page Not Found') 
    ,('DEF','Page Not Found') 
+0

是否所有行處於表格不同?如果是這樣,你可以嘗試'BINARY_CHECKSUM(*)'而不是'NEWID()'。例如。 SELECT *,RowId = ROW_NUMBER()OVER(ORDER BY BINARY_CHECKSUM(*))FROM sys.objects' – Ingaz

+1

您能證明充足的數據和預期的結果嗎? –

回答

3

這真的很簡單:

;WITH cte AS 
(
    SELECT Id, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowId 
    FROM #test 
) 

UPDATE cte 
    SET Id = RowId 
+0

感謝您的回答。我確實得到了這個,但我不確定在where子句中應該放什麼。坦率地說,我很好奇它是如何工作的,哪一行是以什麼爲基礎分配給哪個Id的。任何暗示? – VKarthik

+0

這並不重要,因爲您希望行號是隨機的 –