2012-09-23 40 views
1

我剛剛發現了這個漂亮的小功能。我有幾個問題。請考慮以下聲明。在SQL Server 2008中使用MERGE

這是如何解釋它是如何工作的。 USING語句是比較的,以查看匹配是否正確?我想使用它現在的樣子,但我想在MATCH部分的源表中使用其他兩列。我不能那樣做。那麼有沒有一種方法,我可以使用2列(欺騙(我知道它拼寫錯誤:))和hicno_enc)?
我想要做的另一件事,不知道它是否可能,但如果該行存在於目標中,但不是源,則將其標記爲非活動狀態。

SELECT FIRST_NAME, LAST_NAME, SEX1, BIRTH_DATE 
FROM 
    aco.tmpimport i 
    INNER JOIN aco.patients p 
    ON p.hicnoenc = i.hicno_enc 
    MERGE aco.patients AS target 
    USING (
      SELECT FIRST_NAME, LAST_NAME, SEX1, BIRTH_DATE 
      FROM aco.tmpimport 
     ) AS source 
    ON target.hicnoenc = source.hicno_enc 
    WHEN MATCHED AND target.isdeceased <> CONVERT(BIT,source.decesed) THEN 
     UPDATE 
      SET 
       target.isdeceased = source.decesed, 
       updatedat = getdate(), 
       updatedby = 0 
    WHEN NOT MATCHED THEN 
     INSERT (firstname, lastname, gender, dob, isdeceased, hicnoenc) 
     VALUES (source.FIRST_NAME, 
       source.LAST_NAME, 
       source.sex1, 
       source.BIRTH_DATE, 
       source.decesed, 
       source.hicno_enc); 

回答

2

那麼,有沒有辦法,我可以使用2列(decesed(我知道它 拼錯了:))和hicno_enc)?

在using子句的select語句中添加所需的列。

USING (
     SELECT FIRST_NAME, LAST_NAME, SEX1, BIRTH_DATE, decesed, hicno_enc 
     FROM aco.tmpimport 
    ) AS source 

如果目標而不是源存在該行,然後將其標記無效。

添加when not matched by source子句並進行更新。

WHEN NOT MATCHED BY SOURCE THEN 
    UPDATE 
     SET active = 0 
+0

這是我提到過的一件事。我假設如果我將這兩列添加到選擇,它會嘗試並匹配所有這些列到目標正確?這兩個可能不同,所以我不想匹配它們,但我確實希望能夠使用它們。 – dbinott

+0

不會。因爲您在使用條款中擁有它們,所以它們不會自動用於匹配。 –

+0

哦,所以它只匹配這個target.hicnoenc = source.hicno_enc呢?優秀。 – dbinott