2013-05-10 6 views
2

Я пытаюсь получить следующий код для работы. Я хочу, чтобы обновить TranID только если есть дубликатыКак выполнить обновление, основанное на результатах предложения предложения группы, на

update Test set TranID=(select MAX(TranID)+1 from Test) 
from Test 
group by TranID 
having COUNT(TranID)>1 
+3

В таблице больше столбцов? Я предполагаю, что вы хотите избежать дублирования 'TranID', вызванного обновлением также? Пожалуйста, покажите образец дары и желаемый результат. –

+0

Пожалуйста, напишите инструкцию 'CREATE TABLE' для вашей таблицы – peterm

ответ

1

Попробуйте это:

DECLARE @TranID INT = (SELECT MAX(TranID) 
         FROM Test 
        ); 
    WITH List 
      AS (SELECT ROW_NUMBER() OVER (ORDER BY TranID) + @TranID NewTranID , 
         TranID 
       FROM  Test T 
       WHERE T.TranID IN (SELECT T2.TranID 
             FROM  Test T2 
             GROUP BY T2.TranID 
             HAVING COUNT(T2.TranID) > 1) 
      ) 
    UPDATE List 
    SET  TranID = NewTranID 
+0

Спасибо, что так много Behrouz, что сработало –

0

Off верхней части моей головы, это должно работать:

UPDATE Test 
SET TranID = (select MAX(TranID)+1 from Test) 
FROM Test 
    inner JOIN (SELECT TranID 
      FROM Test 
      GROUP BY TranID 
      HAVING COUNT(*) > 1) d ON d.TranID = Test.TranID 
+0

Это обновляет все, что соответствует одному и тому же значению. –

0

Предполагая, что вы просто хотите обновить все, кроме одного для каждого набора соответствия TranID, затем попробуйте это решение.

-- Setup your data 
IF OBJECT_ID('Test', 'U') IS NOT NULL DROP TABLE Test; 
CREATE TABLE Test (TranID int) 
INSERT Test (TranID) VALUES (1),(2),(2),(3),(3),(3),(6),(6) 
GO 

DECLARE @MaxTranID int = (SELECT MAX(TranID) FROM Test) 

;WITH test_temp (idx, TranID) 
AS 
(
    -- Get a unique identifier for each record 
    SELECT ROW_NUMBER() OVER (ORDER BY TranID) as idx 
      ,TranID 
     FROM Test 
) 
,test_temp_dupes (TranID, MinIdx) 
AS 
(
    -- Get the first record in each TranID group 
    SELECT TranID 
      ,MIN(idx) as MinIdx 
     FROM test_temp 
    GROUP BY TranID 
    HAVING COUNT(*) > 1 
) 

-- Assign new values to each TranID in the dupe groups except the first record 
UPDATE A 
    SET A.TranID = A.idx + @MaxTranID 
    FROM test_temp A 
    JOIN test_temp_dupes B 
    ON A.TranID = B.TranID 
    AND A.idx <> B.MinIdx 

-- See your results 
SELECT * FROM Test 
Смежные вопросы