Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server合并删除与筛选器_Sql_Sql Server_Merge - Fatal编程技术网

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;