6

Usersと#TempTable(Usersのサブセット)の2つのテーブルがあります。Usersテーブルの列IsActiveを更新したいと思います。#TempTableにいるユーザーがUsersテーブルにもある場合は、IsActive = 1に設定し、それ以外の場合はIsActive=0に設定します。

#TempTableにないユーザーからユーザーを取得する(これらのユーザーの場合、IsActiveを0に設定する必要があります)。

-- (Users \ #TempTable) U (#TempTable \ Users)
SELECT  u.UserName
FROM    Users u 
WHERE   (u.UserName) NOT IN 
    (SELECT t.[User Name] FROM #TempTable t) 
UNION ALL 
SELECT  t.[User Name] 
FROM    #TempTable t
WHERE   (t.[User Name]) NOT IN 
    (SELECT u.UserName FROM Users u)

これをResultSetと呼びましょう。UPDATEステートメントについて助けていただければ幸いです。私がしたいことは次のとおりです。

UPDATE Users
SET IsActive = (CASE WHEN User.UserName IN ResultSet THEN 0 ELSE 1 END) 

User.UserNameごとにCASEWHENを書き出す必要はありません。前もって感謝します!

4

1 に答える 1

7

UPDATE ステートメントで結合を使用できます。

UPDATE Users
SET Users.Active = CASE WHEN T.UserName is null THEN 0 ELSE 1 END 
FROM Users AS U
LEFT JOIN #TempTable AS T ON U.UserName = T.UserName

ノート :

  • サブクエリを使用することもできますが、それははるかに遅くなります (n のオーダーではなく、n の 2 乗のオーダー)。少数のユーザーの場合、これは問題になりません。

  • テストを行っていないため、上記のコードにタイプミスやバグがある可能性があります


これがどのように機能しないかについてのクレイジーなコメントに基づいて、フィドルを実装しました。

それを楽しんでください:

http://sqlfiddle.com/#!6/25235/3

于 2013-01-17T21:08:03.847 に答える