2014-03-13 28 views
0

我在接受用戶數據的收集和執行Web服務的SQL PROC如下:WHEN NOT MATCHED BY SOURCE忽略了過濾器

  1. 如果用戶不存在目標,將其插入
  2. 如果用戶在目標存在,從源頭
  3. 任何新的細節更新。如果用戶沒有在源存在,然後將它們歸檔目的地

有一個與最後一個問題( WHEN NOT MATCHED BY SOURCE THEN UPDATE),表中的每一行都被更新爲archived=1。我認爲只有customerId@customerId相匹配的行纔會受到影響,但它會更新除ON中匹配的行以外的所有行,並忽略ON過濾器。

MERGE 
    [tbl_Users] AS tgt -- Target 
USING 
    #tbl_working AS src -- Source 
ON 
    (tgt.customerID = @customerId) AND 
    (tgt.employeeID = src.EmployeeId) 
WHEN MATCHED THEN UPDATE SET -- user exists; update 
    tgt.username = src.username 
    tgt.name = src.FirstName 
WHEN NOT MATCHED BY TARGET THEN INSERT -- user does not exist; create 
    (
    customerID, 
    username, 
    name 
    ) 
    VALUES 
    (
    @customerId, 
    src.UserName, 
    src.Name 
    ) 
WHEN NOT MATCHED BY SOURCE THEN UPDATE -- user no longer required; archive 
    SET tgt.archived = 1; 

我可能沒有正確使用最後一部分,所以請不勝感激。

回答

2

你可能只是想添加一個額外的條件:

WHEN NOT MATCHED BY SOURCE AND tgt.customerID = @CustomerID 
    THEN UPDATE -- user no longer required; archive 
     SET tgt.archived = 1; 

ON子句只是用來決定你sourcetarget如何匹配。在WHEN ...條款的時候,它已經完成了它的工作。它不堅持和有選擇地適用於其他任何東西。


它可以幫助認識到MERGE聲明潛在會影響target表的每一行。

假設發生的事情是我們分裂source表分成兩組行 - sm是通過ON子句匹配在target錶行的行,並su是在source所有剩餘行。

比方說,我們也拆target表分成兩組行 - tm是匹配在source表和行tu是在target所有剩餘行的行。

A WHEN MATCHED子句處理的是成組的行smtm,並計劃如何處理它們。

WHEN NOT MATCHED IN TARGET正在處理一組行su

WHEN NOT MATCHED IN SOURCE正在處理一組行tu

你並不需要在AND tgt.customerID = @CustomerID條件添加到WHEN MATCHED,因爲條件已經用於確定哪些行是在su,哪些是在sm(和tu,和tm)。

希望在您的WHEN NOT MATCHED這條額外的條件,因爲你真的想進一步劃分tu集,而不是將影響所有的行。


你可能要考慮的另一種方法是,你可以先篩選目標表,然後應用針對合併:

;WITH CustomerUsers as (
    SELECT * FROM tbl_Users where customerID = @customerID 
) 
MERGE 
    CustomerUsers AS tgt -- Target 
USING 
    #tbl_working AS src -- Source 
ON 
    (tgt.employeeID = src.EmployeeId) 
... 

現在上面約target僅實際處理討論一切「來自tbl_Users的行的子集屬於@customerID

+0

你是超級巨星!雖然我不確定。爲什麼要在最後一部分停止該子句,但仍然按照預期的方式應用於'WHEN MATCHED THEN UPDATE'?或者應將此行更新爲'WHEN MATCHED AND tgt.customerID = @customerID THEN UPDATE' – EvilDr

+1

@EvilDr - 我試着添加更多解釋。 –

+0

棒極了。非常感謝你。 – EvilDr