Reputation: 49
I have mistakenly inserted wrong data in table rows, now I want to swap the data. Male in place of Female and vice-versa.
Following is the correct data I am expecting -
Upvotes: 4
Views: 7869
Reputation: 1
Use below script to swap values between 2 rows
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL DROP TABLE #TempTable
CREATE TABLE #TempTable
(
ROW_ID INT IDENTITY(1,1),
SEQUENCE_NO INT,
ID INT
)
DECLARE @Id INT = 24780, --Row Id
DECLARE @NewPosition INT = -1; -- (Move Up or Move Down +1 for Up and -1 For Down)
DECLARE @SEQUENCE_NO INT = 0;
INSERT INTO #TempTable
SELECT SEQUENCE_NO ,ID
FROM TABLE_NAME S
WHERE ID = @Id
SET @SEQUENCE_NO = (SELECT SEQUENCE_NO FROM #TempTable)
INSERT INTO #TempTable
SELECT SEQUENCE_NO AS SNO,ID
FROM TABLE_NAME S
WHERE ID <> @Id
AND SEQUENCE_NO = (@SEQUENCE_NO + @NewPosition) -- (Move Up or Move Down +1 for Up and -1 For Down)
--Add check point here temp table to have 2 exact records
;WITH x AS (SELECT ID, SEQUENCE_NO FROM #TempTable WHERE ROW_ID = 1)
, y AS (SELECT ID, SEQUENCE_NO FROM #TempTable WHERE ROW_ID = 2)
UPDATE #TempTable
SET SEQUENCE_NO = z.SEQUENCE_NO
FROM (
SELECT x.ID, y.SEQUENCE_NO FROM x,y
UNION ALL
SELECT y.ID, x.SEQUENCE_NO FROM x,y
) z
WHERE #TempTable.ID = z.ID;
UPDATE SI
SET SI.SEQUENCE_NO = T.SEQUENCE_NO -- (Swap Values here)
FROM TABLE_NAME SI
JOIN #TempTable T ON SI.ID = T.ID
Upvotes: 0
Reputation: 1651
I don't understand why you want a temp table if you can do it with a single update
But maybe this fits what you are looking for
SELECT TOP 0 *
INTO #tmp
FROM YourTable
UPDATE T
SET gender = 'male'
OUTPUT Inserted.* INTO #tmp
FROM YourTable T
WHERE gender = 'female'
UPDATE T
SET gender = 'female'
FROM YourTable
WHERE gender = 'male' --Irrelevant for this case but assuming that you have different values
AND NOT EXISTS (SELECT 1 FROM #Temp WHERE name = T.name) -- Exclude the "swapped" records
Or maybe you just want a temp table to confirm the changes before update them.... i am trying to guess
DECLARE @swap1 VARCHAR(20) = 'male', @swap2 VARCHAR(20) = 'female'
SELECT *
INTO #tmp
FROM YourTable
UPDATE #tmp
SET gender = CASE
WHEN gender = @swap1 THEN @swap2
WHEN gender = @swap2 THEN @swap1
ELSE gender END
SELECT * FROM #tmp
UPDATE A
SET Gender = T.gender
FROM YourTable A
JOIN #tmp T ON A.name = T.name
DROP TABLE #tmp
Upvotes: 0
Reputation: 175556
You could use:
UPDATE table_name
SET Gender = CASE Gender
WHEN 'Male' THEN 'Female'
WHEN 'Female' THEN 'Male'
ELSE Gender
END;
Please note that other values than male/female
like N/A
or NULL
will remain the same.
If you want to do it only for specified names use:
UPDATE table_name
SET Gender = CASE
WHEN Name IN ('Geetha', 'Radha') THEN 'Female'
WHEN Name IN ('Ram', 'Syam', 'Ravi') THEN 'Male'
END
WHERE Name IN ('Ram', 'Syam', 'Geetha', 'Radha', 'Ravi');
Upvotes: 2
Reputation: 2179
Simple update works:
UPDATE myTable
SET
col1 = CASE WHEN col1 = 'male' THEN 'female' ELSE 'male' END,
col2 = CASE WHEN col2 = 'female' THEN 'male' ELSE 'female' END
Result: row values will be swap.
I hope, It will work for you.
Upvotes: 9