我正在使用一些數據在SQL服務器上。一個表有4個相同的行,並沒有任何主鍵。我希望更新那些4行中的任何一行可能是最上面一行。更新頂部查詢
可以做到這一點嗎?我試圖通過很多方式操縱更新查詢,但沒有任何工作......
我正在使用一些數據在SQL服務器上。一個表有4個相同的行,並沒有任何主鍵。我希望更新那些4行中的任何一行可能是最上面一行。更新頂部查詢
可以做到這一點嗎?我試圖通過很多方式操縱更新查詢,但沒有任何工作......
在SQL Server 2008中有%% physloc %%的未公開的不受支持的功能,可能等同於RowId。我認爲我們應該可以使用它。
--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
)
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;
如果你不關心你是哪一個,你可以做兩個(簡單)的事情之一。
使用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()
選項應該工作。
你有臺這樣
而且要更新第一行的每個重複行
這樣
alter table TestTable
Add RowID bigint identity(-9223372036854775808, 1) not null;
創建新列更新每個重複行的第一行
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
你能不能爲行添加主鍵? – 2011-12-15 18:49:15