1

私は2つのテーブルを持っています。ユーザーと UserMap。私はこのようなものが必要です...

INSERT INTO USERS (USER_ID, VALUE_TYPE, SOME_VALUE)
SELECT USERS.ID, 0, 1

問題は、ユーザーとタイプが既に存在する場合、挿入ではなく更新したいということです。これが私の解決策です。

DELETE FROM USERS
WHERE USERS.VALUE_TYPE = 0

INSERT INTO USERS (USER_ID, VALUE_TYPE, SOME_VALUE)
SELECT USERS.ID, 0, 1
FROM USERS

これは機能します。存在する場合は、より良いものを探していました。推奨事項はありますか?

編集。おっと、これを間違って入力しました。混乱して申し訳ありません。すべての助けに感謝します。

4

1 に答える 1

4

あなたが現在行っていることは非常に高価です。100 万行あり、4 行しか変更されていない場合はどうなるでしょうか。行が変更されていない場合はどうなりますか?

典型的なモデルは次のようなものです。

-- first, update the rows that match
UPDATE u
  SET SOME_VALUE = m.SOME_VALUE
  FROM dbo.Users AS u
  INNER JOIN dbo.UserMap AS m
  ON u.ID = m.USER_ID
  AND u.VALUE_TYPE = m.VALUE_TYPE
  WHERE u.VALUE_TYPE = 0;

-- next, add the rows that don't match
INSERT dbo.Users(USER_ID, VALUE_TYPE, SOME_VALUE)
  SELECT m.USER_ID, 0, 1
  FROM dbo.UserMap AS m
  WHERE NOT EXISTS 
  (
    SELECT 1 FROM dbo.Users
      WHERE ID = m.USER_ID
      AND VALUE_TYPE = 0
  );

を使用することもできますMERGEが、個人的には構文がかなり難しいと思います。また、それに対して報告されたすべてのバグが解決されているとは信じていません。(別リンク

于 2013-01-29T19:00:20.303 に答える