更新没有任何标识列的单行

时间:2013-03-20 15:20:31

标签: sql-server sql-update

我有一个非常特殊的问题,请考虑这两行:

val   | text     | akr       | usr_bk      
-----------------------------------------------
001   | hello    | 1024      | admin
001   | hello    | 1024      | admin

如您所见,我没有唯一的专栏或其他标识符。

但;是否有可能(以及如何)只更新一个行,例如val = 002 没有修改另一行?

我在SQL Server 2008上运行。

1 个答案:

答案 0 :(得分:4)

你需要知道你想要哪一个,但你可以用你给出的示例数据这样做:

;WITH NumberedTbl AS (
  SELECT ROW_NUMBER() OVER (
    PARTITION BY val, text, akr, admin
    ORDER BY val, text, akr, admin
  ) AS RowNumber,
  val, text, akr, admin
  FROM tbl
)

UPDATE t
SET val = '002'
FROM NumberedTbl t
WHERE t.RowNumber = 1

SELECT * FROM tbl

请参阅此SqlFiddle for a live example。您可能想要做的是构建它并进行设置,以便您像这样过滤WITH表:

;WITH NumberedTbl AS (
  SELECT ROW_NUMBER() OVER (
    PARTITION BY val, text, akr, admin
    ORDER BY val, text, akr, admin
  ) AS RowNumber,
  val, text, akr, admin
  FROM tbl
  WHERE ... -- ADD SOME WHERE CLAUSE HERE
)