我正在处理sql server上的一些数据。一个表有4个相同的行,没有任何主键。我希望更新这4行中的任何一行可能是最上一行。
有可能这样做吗?我尝试通过很多方式操作更新查询来做到这一点,但没有任何作用......
答案 0 :(得分: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 :(得分: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()
选项应该有用。
答案 2 :(得分:0)
SQL Server 2008中有%% physloc %%的未记录的不受支持的功能,可能等同于RowId。我认为我们应该可以使用它。
- 解决方案(未经测试) 假设我们有一个Table1表,其中包含两列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 :(得分:0)
你有这样的表
并且您想要为每个重复行更新第一行
像这样创建新列
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