2011-12-15 33 views
2

我正在使用一些數據在SQL服務器上。一個表有4個相同的行,並沒有任何主鍵。我希望更新那些4行中的任何一行可能是最上面一行。更新頂部查詢

可以做到這一點嗎?我試圖通過很多方式操縱更新查詢,但沒有任何工作......

+0

你能不能爲行添加主鍵? – 2011-12-15 18:49:15

回答

0

在SQL Server 2008中有%% physloc %%的未公開的不受支持的功能,可能等同於RowId。我認爲我們應該可以使用它。

參考 Code Project Link

--Solution(未測試) 假設我們有一個表表1具有兩列col1和col2的

UPDATE TABLE1 
SET COL1 = New_Value1, 
    COL2 = NEW_Value2 
WHERE %%physloc%% IN 
(
    SELECT PhysicalLocation 
     FROM (
      SELECT %%physloc%% As PhysicalLocation, 
        ROW_NUMBER() Over (Partition By Col1,Col2 Order By Col1,Col2) As RowNumber 
       FROM TABLE1) AS T 
    WHERE RowNumber = 1 
) 
3

http://msdn.microsoft.com/en-us/library/ms177523.aspx

在TOP功能可以被包括在一個查詢以限制由UPDATE查詢更新的條目數。在這種情況下,可以通過向查詢添加WHERE子句來創建查詢,該查詢包含預期匹配的所有標識字段,並使用前面評論的TOP函數。例如:

some_table[ 
    field1, 
    field2, 
    field3 
] 

UPDATE TOP(1) some_table 
    SET field1 = @value1, field2 = @value2, field3 = @value3 
    WHERE 
    field1 = @currentValue1 AND 
    field2 = @currentValue2 AND 
    field3 = @currentValue3; 
1

如果你不關心你是哪一個,你可以做兩個(簡單)的事情之一。

使用ROW_NUMBER()在編譯時每行創建一個唯一編號,或者在表中添加一個字段來標識每行。以下是兩者的示例代碼。

CREATE TABLE #blah (Cola char(1), Colb char(1)) 

INSERT INTO #blah 
VALUES 
('a','b'), 
('a','b'), 
('b','c') 

SELECT * FROM #blah 

SELECT *, ROW_NUMBER() OVER (ORDER BY Cola) 
FROM #blah 

ALTER TABLE #blah 
ADD IdField INT IDENTITY 

SELECT * 
FROM #blah 

DROP TABLE #blah 

對於永久性解決方案,您應該使用Identity字段。如果這是一次性事情,那麼Row_Number()選項應該工作。

0

你有臺這樣

enter image description here

而且要更新第一行的每個重複行

  1. 這樣

    alter table TestTable 
    Add RowID bigint identity(-9223372036854775808, 1) not null; 
    
  2. 創建新列更新每個重複行的第一行

    UPDATE TestTable SET Col2 = NULL 
        WHERE RowID IN (
        SELECT * 
        FROM (
         select *, ROW_NUMBER() over (partition BY Col1 order by Col1) rnum 
         from TestTable 
        ) T 
        WHERE T.rnum = 1