更新热门查询

时间:2011-12-15 18:46:38

标签: sql-server-2008 sql-update

我正在处理sql server上的一些数据。一个表有4个相同的行,没有任何主键。我希望更新这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。我认为我们应该可以使用它。

参考 Code Project Link

- 解决方案(未经测试) 假设我们有一个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)

你有这样的表

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