R2D*_*2D2 5 sql sql-server merge
当主键匹配且没有活动"Y"插入记录的行时,我想执行以下操作.这可能吗?
我试过这个:
-- Merge statement
MERGE INTO table1 AS DST
USING table2 AS SRC
ON (SRC.Code = DST.Code)
--Existing records updated if data changes
WHEN MATCHED
AND IF NOT EXISTS (WHERE active='Y' FROM table1 )
THEN
INSERT INTO table1 (colum)
SELECT value
+-------+-------------+--------+
| Code | description | Active |
+-------+-------------+--------+
| AB | just | |
| | something | No |
+-------+-------------+--------+
Run Code Online (Sandbox Code Playgroud)
只有当没有相同代码的活动记录时,我才想插入记录.新记录看起来像这样
+-------+-------------+--------+
| Code | description | Active |
+-------+-------------+--------+
| AB | something | |
| | else | YES |
+-------+-------------+--------+
Run Code Online (Sandbox Code Playgroud)
我希望这更清楚
编辑:没关系它不可能,我刚收到此错误消息:MERGE语句的'WHEN MATCHED'子句中不允许使用类型为'INSERT'的操作.
如果我理解正确,那么从中插入的行@T2不在@T1其中Active = 'y'.
declare @T1 table
(
Code char(2),
Descr varchar(10),
Active char(1)
)
declare @T2 table
(
Code char(2),
Descr varchar(10)
)
insert into @T1 values
('1', 'Desc 1', 'y'),
('2', 'Desc 2', 'n')
insert into @T2 values
('1', 'Desc 1'),
('2', 'Desc 2'),
('3', 'Desc 3')
merge @T1 as D
using @T2 as S
on D.Code = S.Code and
D.Active = 'y'
when not matched then
insert (Code, Descr, Active)
values (Code, Descr, 'y');
select *
from @T1
Run Code Online (Sandbox Code Playgroud)
结果:
Code Descr Active
---- ---------- ------
1 Desc 1 y
2 Desc 2 n
2 Desc 2 y
3 Desc 3 y
Run Code Online (Sandbox Code Playgroud)
还将插入代码3的行.如果你不想那样,意味着你只想插入一行,@T1如果已存在一行@T2代码匹配,但Active = 'n'你可以使用它.
merge @T1 as D
using (select Code,
Descr
from @T2
where Code in (select Code
from @T1
where Active = 'n')) as S
on D.Code = S.Code and
D.Active = 'y'
when not matched then
insert (Code, Descr, Active)
values (Code, Descr, 'y');
Run Code Online (Sandbox Code Playgroud)
结果:
Code Descr Active
---- ---------- ------
1 Desc 1 y
2 Desc 2 n
2 Desc 2 y
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9342 次 |
| 最近记录: |