1

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

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

你目前正在做的事情非常昂贵。如果您有一百万行并且只有四行发生了变化怎么办?如果没有行发生变化怎么办?

典型的模型是这样的:

-- 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 回答