組中的having子句的結果執行更新我試圖讓下面的代碼工作。我想更新TranID只要有重複如何根據
update Test set TranID=(select MAX(TranID)+1 from Test)
from Test
group by TranID
having COUNT(TranID)>1
組中的having子句的結果執行更新我試圖讓下面的代碼工作。我想更新TranID只要有重複如何根據
update Test set TranID=(select MAX(TranID)+1 from Test)
from Test
group by TranID
having COUNT(TranID)>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
非常感謝Behrouz,這很有效 – 2013-05-20 15:09:41
關閉我的頭頂,這應該工作:
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
這會更新與完全相同的值匹配的所有內容。 – 2013-05-14 04:27:00
假設你只是想更新除了每個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
表格是否有更多列?我假設你想避免由更新引起的重複'TranID'?請顯示示例dara和期望的結果。 – 2013-05-10 19:25:36
請爲您的表發佈「CREATE TABLE」語句 – peterm 2013-05-10 19:30:03