2014-10-01 61 views
0

即時通訊使用合併做插入或刪除,我不知道該怎麼看。我有一個映射表,將分類法映射到受支持的語言。該表的樣子: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 

回答

1

你必須把它分成兩個通行證,因爲數量關鍵字段不同。

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