首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将传统的IF EXIST UPDATE ELSE INSERT转换为MERGE不起作用吗?

将传统的IF EXIST UPDATE ELSE INSERT转换为MERGE不起作用吗?
EN

Stack Overflow用户
提问于 2013-07-03 19:47:35
回答 4查看 1.1K关注 0票数 0

我将使用MERGE来插入或更新表,这取决于它是否存在。这是我的问题,

代码语言:javascript
运行
复制
declare @t table
(
    id int,
    name varchar(10)
)
insert into @t values(1,'a')

MERGE INTO @t t1
USING (SELECT id FROM @t WHERE ID = 2) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
    UPDATE SET name = 'd', id = 3
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (2, 'b');

select * from @t;

结果是,

代码语言:javascript
运行
复制
id  name
1   a

我觉得应该是,

代码语言:javascript
运行
复制
id  name
1   a
2   b
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-03 20:04:14

正如Mikhail所指出的,USING子句中的查询不包含任何行。

如果要执行upsert,请将新数据放入USING子句:

代码语言:javascript
运行
复制
MERGE INTO @t t1
USING (SELECT 2 as id, 'b' as name) t2 ON (t1.id = t2.id) --This no longer has an artificial dependency on @t
WHEN MATCHED THEN
    UPDATE SET name = t2.name
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (t2.id, t2.name);
票数 2
EN

Stack Overflow用户

发布于 2013-07-03 20:03:27

您的USING部分稍微有点混乱,这就是您想要匹配的内容的位置(尽管在本例中您只使用id)

代码语言:javascript
运行
复制
declare @t table
(
    id int,
    name varchar(10)
)

insert into @t values(1,'a')

MERGE INTO @t t1
USING (SELECT 2, 'b') AS t2 (id, name) ON (t1.id = t2.id)
WHEN MATCHED THEN
    UPDATE SET name = 'd', id = 3
WHEN NOT MATCHED THEN
    INSERT (id, name)
    VALUES (2, 'b');

select * from @t;
票数 3
EN

Stack Overflow用户

发布于 2013-07-03 19:56:58

此查询不会返回任何内容:

代码语言:javascript
运行
复制
SELECT id FROM @t WHERE ID = 2

因为where在表中没有ID = 2的行,所以没有东西可以合并到表中。

此外,在MATCHED子句中,您正在更新您正在连接表的字段ID,我认为这是被禁止的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17447127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档