MS SQL更新查询 - 将具有相同字段A的所有行更新为顶部A值

时间:2013-05-02 21:00:15

标签: sql sql-server-2005

这应该很容易,但我只是没有得到它。我有一个临时表,我从不同的来源填充。在临时表中,我有一堆可能具有相同细分名称的行。如果细分名称相同,那么我希望该细分的顶部纬度和经度位于该细分的所有行中。我需要为临时表中的所有子区域执行此操作,其中iSource = 1或2. iSource字段是不同的源。 0是最可靠的,第4是没有lat或long。

临时表

SubdivisionName  Latitude  Longitude  iSource
A                100       200        0
A                100       200        0
A                102       200        2
B                104       202        1
B                105       203        1
B                106       202        2

期望的结果

SubdivisionName  Latitude  Longitude  iSource
A                100       200        0
A                100       200        0
A                100       200        2
B                104       202        1
B                104       202        1
B                104       202        2

我尝试了这个,但SQL Server 2005不喜欢我的前缀TT或TTT。你能指出我正确的方向吗?

WITH #TempTable
AS
(
SELECT TTT.*
, ROW_NUMBER() OVER(PARTITION by SubdivisionName ORDER BY iSource) AS rnk
from #TempTable TTT WHERE iSource IN (1,2)
)
UPDATE #TempTable
SET FieldSheetLat = TTT.FieldSheetLat, Longitude = TTT.FieldSheetLong

1 个答案:

答案 0 :(得分:0)

;WITH CTE
AS
(
    SELECT TTT.*
         , ROW_NUMBER() OVER(PARTITION by SubdivisionName ORDER BY iSource) AS rnk
      FROM #TempTable TTT
)
UPDATE TT
   SET FieldSheetLat = CTE.FieldSheetLat, Longitude = CTE.FieldSheetLong
  FROM #TempTable TT
  JOIN CTE ON CTE.SubdivisionName = TT.SubdivisionName
              AND CTE.rnk = 1
 WHERE TT.iSource > 0;

注释

  1. 最后一个过滤器是因为永远不需要更新任何iSource = 0行
  2. 此处使用来自JOIN模式的UPDATE,其中来源为CTE where rnk=1,目标为#TempTable别名为TT