我有两张桌子。用户和用户地图。我需要这样的东西......
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
这很有效,如果它存在,我只是想找更好的东西。有什么建议吗?
编辑。哎呀,我打错了。对不起,感谢您的帮助。
答案 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。)