web-dev-qa-db-ja.com

2行の2つの値を切り替えるSQLUPDATEステートメント

SQLServerを使用して2つの行の2つの値を交換しています。私に見せてください:

[ord] [name]
1     John
4     Jack
7     Pete
9     Steve
11    Mary

たとえば、このテーブルを次のようにするには、[ord]番号を「Pete」と「Steve」に交換する必要があります。

[ord] [name]
1     John
4     Jack
9     Pete
7     Steve
11    Mary

これは些細な作業のように思えますが、SQLUPDATEステートメントを記述できないようです。

16
ahmd0

'Peter'および'Steve'はテーブル内で一意であり、これにより次のことが行われます。

UPDATE TableX
SET ord = ( SELECT MIN(ord) + MAX(ord) 
            FROM TableX 
            WHERE name IN ('Peter', 'Steve')
          ) - ord
WHERE name IN ('Peter', 'Steve')

または(@Erwinによって改善されました):

UPDATE TableX
SET ord = ( SELECT SUM(ord) 
            FROM TableX 
            WHERE name IN ('Peter', 'Steve')
          ) - ord
WHERE name IN ('Peter', 'Steve')
19
ypercubeᵀᴹ

[〜#〜] case [〜#〜] 式を使用します:

UPDATE yourtable
SET [ord] = CASE [ord] WHEN 9 THEN 7
                       WHEN 7 THEN 9 END
WHERE [ord] IN (7, 9)
7
Mark Byers

これは、前の質問と非常によく似ています。 2つのテーブルの配置で行を上下に移動するSQL
別の data.stackexchange.comのデモ を用意しました。

編集:セットアップが簡略化されたので、それに応じてクエリを簡略化しました。

WITH x AS (SELECT name, ord FROM t WHERE name = 'Pete')  -- must be unique!
   , y AS (SELECT name, ord FROM t WHERE name = 'Steve') -- must be unique!
UPDATE t
SET    ord = z.ord
FROM  (
   SELECT x.name, y.ord FROM x,y
   UNION  ALL
   SELECT y.name, x.ord FROM x,y
   ) z
WHERE t.name = z.name;

このクエリは、両方の行が見つかった場合にのみ更新され、それ以外の場合は何も実行されません。

7
UPDATE Table_1
SET ord =
    CASE name
    WHEN 'Pete' THEN (SELECT ord FROM Table_1 WHERE name = 'Steve')
    WHEN 'Steve' THEN (SELECT ord FROM Table_1 WHERE name = 'Pete')
    END
WHERE name IN ('Pete', 'Steve')

'Pete'および'Steve'を他の名前に簡単に置き換えることができます。

3

以下のスクリプトを使用して値を交換します


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
0
BILAL WANI
BEGIN TRANSACTION

UPDATE TABLENAME
SET ord = 9 
where name = 'Pete'

UPDATE TABLENAME
SET ord = 7
where name = 'Steve'

COMMIT TRANSACTION
0
mjwills