UPDATE存在的行,INSERT不存在的行

时间:2013-01-29 18:26:42

标签: sql sql-server-2008

我有两张桌子。用户和用户地图。我需要这样的东西......

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

这很有效,如果它存在,我只是想找更好的东西。有什么建议吗?

编辑。哎呀,我打错了。对不起,感谢您的帮助。

1 个答案:

答案 0 :(得分: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但我个人认为语法相当令人生畏。另外,我不确定我是否相信all of the bugs that have been reported against it已经解决了。 (Different link。)