【发布时间】:2018-02-15 04:51:36
【问题描述】:
假设我有一个带有复合主键的表:
create table FooBar (
fooId int not null,
barId int not null,
status varchar(20) not null,
lastModified datetime not null,
constraint PK_FooBar primary key (fooId, barId)
);
现在我有一些特定 fooId 的表格数据,可能是这样的:
1, 1, 'ACTIVE'
1, 2, 'INACTIVE'
...我想创建一个 MERGE 语句,将此表格数据视为权威仅适用于 fooId 1,删除 FooBar 中适用于 @987654327 的任何不匹配记录@ 1,但将所有记录保留为 fooId,这 不是 1。
例如,假设FooBar 表当前有以下数据:
1, 1, 'ACTIVE', ... (some date, not typing it out)
2, 1, 'ACTIVE', ...
1, 3, 'INACTIVE', ...
2, 2, 'INACTIVE'
我想对上面提到的两个数据集运行一个合并语句,FooBar 中的结果数据集应该如下所示:
1, 1, 'ACTIVE', ...
2, 1, 'ACTIVE', ...
1, 2, 'INACTIVE', ...
2, 2, 'INACTIVE', ...
我希望删除1, 3, 'INACTIVE' 行,并使用新修改的时间戳更新1, 1, 'ACTIVE' 行,并插入1, 2, 'INACTIVE' 行。我还希望 fooId 的 2 记录保持不变。
这可以在一个语句中完成吗?如果有,怎么做?
【问题讨论】:
-
通常,合并可以从源中插入目标中不存在的行,更新(源和目标)中都存在的行并删除源不匹配的内容(也将此调整为 foodId = 1 可以完成)但也许您应该提供源、目标和预期结果的示例数据以获得更好的答案。也许this thread 有帮助。
标签: sql-server merge upsert