使用另一行的某些值更新每一行

时间:2013-04-24 12:06:18

标签: sql sql-server database

我想在SQL中编写一个更新查询,如下所示:

UPDATE A
SET A.PARENT_ID = [ID of another row]
FROM MY_TABLE AS A

我想要做的是,对于要应用此更新的每一行,我希望它从以下查询中计算部分[ID of another row]

SELECT A.NAME, B.NAME, MAX(B.ID)
FROM MY_TABLE A, MY_TABLE B
WHERE A.NAME = B.NAME

基本上是这样的:

  1. 在更新行时,它会尝试查找与正在更新的当前行同名的其他行。
  2. 其中,它会尝试获取具有最高ID
  3. 的行
  4. 然后它会将当前正在更新的行的PARENT_ID值更新为它找到的行的ID值。
  5. 在SQL Server 2008中执行类似操作的方法是什么?

3 个答案:

答案 0 :(得分:3)

那么,具有相同Name的每一行应该具有相同的ParentID,那应该是该名称的最高分配ID值?

这应该做:

;with Highest as (
    select ID,Name,ParentID,MAX(ID) OVER (PARTITION BY Name) as NewParentID
    from MY_TABLE
)
update Highest set ParentID = NewParentID

进一步阅读:

答案 1 :(得分:2)

请尝试INNER JOIN UPDATE:

UPDATE A
SET A.PARENT_ID = B.mx
FROM MY_TABLE A
INNER JOIN (SELECT C.PARENT_ID mx, MAX(C.ID) OVER (PARTITION BY C.NAME)
            FROM MY_TABLE C
)B 
ON A.PARENT_ID=B.PARENT_ID

提供PARENT_ID是唯一的。

答案 2 :(得分:1)

怎么样?:

UPDATE A
SET A.PARENT_ID = (SELECT MAX(B.ID)
           FROM MY_TABLE B
           WHERE A.NAME = B.NAME)
FROM MY_TABLE AS A