SQL Server:使用第一个副本中的数据更新重复项

时间:2013-08-16 20:44:44

标签: sql-server

我得到以下结果:

**SID**  **KL**   **ABT**  **KLH**  **ABTH**
013239   PKB4     GT      NULL      NULL
013239   TM4A     KD      NULL      NULL
013243   KSB4     GT      NULL      NULL
013243   TM4A     KD      NULL      NULL

使用此查询:

SELECT DISTINCT 
    SID, KL, ABT, KLH, ABTH 
FROM 
    [SGB] 
WHERE 
    SID IN (SELECT SID FROM [SGB] GROUP BY SID HAVING COUNT(*) > 1)

我想从第一次 KL ABT 的内容更新 KLH ABTH 重复。

应如下所示:

**SID**  **KL**   **ABT**  **KLH**  **ABTH**
013239   PKB4     GT      PKB4      GT
013239   TM4A     KD      PKB4      GT
013243   KSB4     GT      KSB4      GT
013243   TM4A     KD      KSB4      GT

非常感谢!

3 个答案:

答案 0 :(得分:0)

 select * into #temptable from  [SGB] 
  update #temptable t
  set **KLH** =**KL**
  set **ABTH**=**ABT** 
  from [SGB] s  
  inner join s.**SID**=t.**SID**      

答案 1 :(得分:0)

UPDATE B
SET KLH=A.KL,
ABTH=A.ABT
FROM [SGB] A JOIN [SGB]  B ON A.SID=B.SID

答案 2 :(得分:0)

以下是使用第一个值更新所有重复的SID的查询:

;WITH tempSGB AS (
    SELECT SID
    , KL
    , ABT
    , KLH
    , ABTH
    --Next column set numbers in order for rows
    , ROW_NUMBER() OVER (PARTITION BY SID ORDER BY KL) AS ROWNUM
    FROM SGB
    WHERE SID IN (SELECT SID FROM SGB GROUP BY SID HAVING COUNT(*) > 1)
)

UPDATE s SET
s.KLH = tmp.KL
, s.ABTH = tmp.ABT
FROM tempSGB tmp
INNER JOIN SGB s ON s.SID = tmp.SID
WHERE ROWNUM = 1; --here we choose only first row from duplicated

About ROW_NUMBER()

但你没有提到查询如何决定哪一行首先来自所有重复(在我按KL顺序设置的例子中)

此处SQL Fiddle是包含测试数据的示例查询