MERGE - 用 sql 服务器替换 ON Duplicate
MERGE - to replace ON Duplicate with sql server
我主要使用 mySQL 所以转移到 azure 和 sql 服务器我意识到在重复上不起作用。
我正在尝试这样做:
INSERT INTO records (jid, pair, interval, entry) VALUES (1, 'alpha', 3, 'unlimited') ON DUPLICATE KEY UPDATE entry = "limited";
但是这里当然不允许重复键。所以 MERGE 是正确的形式。
我看过:
https://technet.microsoft.com/en-gb/library/bb522522(v=sql.105).aspx
但老实说,这个例子有点过分,让人流口水。有人可以为我简化它以适合我的示例以便我更好地理解它吗?
为了进行合并,您需要某种形式的源 table/table var 用于合并语句。然后你可以进行合并。所以可能是这样的(注意:没有完全检查语法,提前道歉):
WITH src AS (
-- This should be your source
SELECT 1 AS Id, 2 AS Val
)
-- The above is not neccessary if you have a source table
MERGE Target -- the detination table, so in your case records
USING src -- as defined above
ON (Target.Id = src.Id) -- how do we join the tables
WHEN NOT MATCHED BY TARGET
-- if we dont match, what do to the destination table. This case insert it.
THEN INSERT(Id, Val) VALUES(src.Id, src.Val)
WHEN MATCHED
-- what do we do if we match. This case update Val
THEN UPDATE SET Target.Val = src.Val;
不要忘记阅读正确的语法页面:https://msdn.microsoft.com/en-us/library/bb510625.aspx
我认为这可以转化为您的示例 (tm):
WITH src AS (
-- This should be your source
SELECT 1 AS jid, 'alpha' AS pair, 3 as 'interval'
)
MERGE records -- the detination table, so in your case records
USING src -- as defined above
ON (records.Id = src.Id) -- how do we join the tables
WHEN NOT MATCHED BY TARGET
-- if we dont match, what do to the destination table. This case insert it.
THEN INSERT(jid, pair, interval, entry) VALUES(src.jid, src.pair, src.interval, 'unlimited')
WHEN MATCHED
-- what do we do if we match. This case update Val
THEN UPDATE SET records.entry = 'limited';
我主要使用 mySQL 所以转移到 azure 和 sql 服务器我意识到在重复上不起作用。
我正在尝试这样做:
INSERT INTO records (jid, pair, interval, entry) VALUES (1, 'alpha', 3, 'unlimited') ON DUPLICATE KEY UPDATE entry = "limited";
但是这里当然不允许重复键。所以 MERGE 是正确的形式。
我看过: https://technet.microsoft.com/en-gb/library/bb522522(v=sql.105).aspx
但老实说,这个例子有点过分,让人流口水。有人可以为我简化它以适合我的示例以便我更好地理解它吗?
为了进行合并,您需要某种形式的源 table/table var 用于合并语句。然后你可以进行合并。所以可能是这样的(注意:没有完全检查语法,提前道歉):
WITH src AS (
-- This should be your source
SELECT 1 AS Id, 2 AS Val
)
-- The above is not neccessary if you have a source table
MERGE Target -- the detination table, so in your case records
USING src -- as defined above
ON (Target.Id = src.Id) -- how do we join the tables
WHEN NOT MATCHED BY TARGET
-- if we dont match, what do to the destination table. This case insert it.
THEN INSERT(Id, Val) VALUES(src.Id, src.Val)
WHEN MATCHED
-- what do we do if we match. This case update Val
THEN UPDATE SET Target.Val = src.Val;
不要忘记阅读正确的语法页面:https://msdn.microsoft.com/en-us/library/bb510625.aspx
我认为这可以转化为您的示例 (tm):
WITH src AS (
-- This should be your source
SELECT 1 AS jid, 'alpha' AS pair, 3 as 'interval'
)
MERGE records -- the detination table, so in your case records
USING src -- as defined above
ON (records.Id = src.Id) -- how do we join the tables
WHEN NOT MATCHED BY TARGET
-- if we dont match, what do to the destination table. This case insert it.
THEN INSERT(jid, pair, interval, entry) VALUES(src.jid, src.pair, src.interval, 'unlimited')
WHEN MATCHED
-- what do we do if we match. This case update Val
THEN UPDATE SET records.entry = 'limited';