SQL服务器合并使用过滤器删除

问题描述:

即时通讯使用合并做插入或删除,我不知道该怎么看。我有一个映射表,将分类法映射到受支持的语言。该表的样子:SQL服务器合并使用过滤器删除

TaxonomyLanguageID(PK) | TaxonomyID(FK) | LanguageID(FK) 

我想要做的是合并的临时表上面的表,其中临时表将有支持的语言分类法的列表。例如:

TaxonomyID|LanguageID 

456,  2 

456,  3 

456,  9 

我已经试过像这样(的选择是进行测试,以后这将是一个临时表):

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) 
WHEN NOT MATCHED BY SOURCE AND T.TaxonomyID=s.TaxonomyID 
    THEN DELETE; 

我想这个做的是插入,如果它不匹配,如果不匹配则删除,但只删除目标中与源中找到的taxonomyID匹配的那些行。

但是,我得到一个“只有目标列允许在'不匹配的源'子句'错误。

关于如何解决这个问题(或者应该如何完成)的想法?

我在找什么样的例子。如果我有一个源像

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; 
+0

我可以有我的问题很少,但是这只是删除所有其他行。我只想删除与源中的TaxonomyID匹配的行,但不匹配languageID。我用一个例子更新我的问题 – 2014-10-01 14:07:34

+0

好的。然后使用MATCHED和过滤器。 – 2014-10-01 14:14:54

+0

MERGE dbo.TaxonomyLanguages为t 使用(选择456作为TaxonomyID,3为LanguageID)为S ON(s.TaxonomyID = T.TaxonomyID) WHEN MATCHED 和(s.LanguageID T.LanguageID) 然后删除; – 2014-10-01 14:15:18