SQL server合并删除与筛选器
我正在使用“合并”来执行插入或删除操作,但我不确定这应该是什么样子。我有一个映射表,它将分类法映射到支持的语言。那张桌子看起来像:SQL server合并删除与筛选器,sql,sql-server,merge,Sql,Sql Server,Merge,我正在使用“合并”来执行插入或删除操作,但我不确定这应该是什么样子。我有一个映射表,它将分类法映射到支持的语言。那张桌子看起来像: TaxonomyLanguageID(PK) | TaxonomyID(FK) | LanguageID(FK) 我要做的是将一个临时表与上面的表合并,其中临时表将有一个支持分类法的语言列表。例如: TaxonomyID|LanguageID 456, 2 456, 3 456, 9 我尝试的是这样的(选择用于测试
TaxonomyLanguageID(PK) | TaxonomyID(FK) | LanguageID(FK)
我要做的是将一个临时表与上面的表合并,其中临时表将有一个支持分类法的语言列表。例如:
TaxonomyID|LanguageID
456, 2
456, 3
456, 9
我尝试的是这样的(选择用于测试,稍后这将是一个临时表):
我希望这样做的是,如果不匹配则插入,如果不匹配则删除,但只删除目标中与源中找到的taxonomyID匹配的行
但是我得到了一个“在'whennotmatchedbysource'子句中只允许目标列”错误
有没有关于如何解决这个问题的想法(或者应该怎么做)
我要找的例子。如果我有这样的消息来源
TaxonomyID|LanguageID
4000, 2
4000, 3
目标是:
TaxonomyLanguageID|TaxonomyID|LanguageID
1, 3000 2
2, 4000 1
3, 4000 2
最终结果将是:
TaxonomyLanguageID|TaxonomyID|LanguageID
1, 3000 2
3, 4000 2
4, 4000 3
您必须将其分为两个过程,因为关键字段的数量不同
Select 456 as TaxonomyID, 2 as LanguageID
into TaxonomyLanguages
INSERT INTO [dbo].[TaxonomyLanguages]
([TaxonomyID]
,[LanguageID])
VALUES
(456, 3)
,(456, 9)
GO
select *
from [TaxonomyLanguages]
MERGE dbo.TaxonomyLanguages as t
using (SELECT 5395 as TaxonomyID, 2 as LanguageID) as s
ON (s.TaxonomyID=T.TaxonomyID AND s.LanguageID=t.LanguageID)
WHEN NOT MATCHED BY TARGET THEN
INSERT(TaxonomyID,LanguageID) VALUES(S.TaxonomyID,s.LanguageID);
MERGE dbo.TaxonomyLanguages as t
using (SELECT 5395 as TaxonomyID, 2 as LanguageID) as s
ON (s.TaxonomyID=T.TaxonomyID)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
select *
from [TaxonomyLanguages]
根据注释,更改第二次合并:
MERGE dbo.TaxonomyLanguages as t
using (SELECT 456 as TaxonomyID, 3 as LanguageID) as s
ON (s.TaxonomyID=T.TaxonomyID)
WHEN MATCHED
and (s.LanguageID <> T.LanguageID)
THEN DELETE;
将dbo.t语言合并为t
使用(选择456作为分类ID,选择3作为LanguageID)作为s
ON(s.TaxonomyID=T.TaxonomyID)
匹配时
和(s.LanguageID T.LanguageID)
然后删除;
我的问题可能写得不好,但这只会删除所有其他行。我只想删除源代码中与TaxonomyID匹配的行,但不想删除与languageID匹配的行。我会用一个例子更新我的问题OK。然后使用MATCHED with a filter.MERGE dbo.TaxonomyLanguages as t using(选择456作为TaxonomyID,选择3作为LanguageID)作为s ON(s.TaxonomyID=t.TaxonomyID),当匹配时(s.LanguageID t.LanguageID),然后删除;
MERGE dbo.TaxonomyLanguages as t
using (SELECT 456 as TaxonomyID, 3 as LanguageID) as s
ON (s.TaxonomyID=T.TaxonomyID)
WHEN MATCHED
and (s.LanguageID <> T.LanguageID)
THEN DELETE;