2017-09-26 98 views
0

我有一個名爲SalesOrders的表。我將多個表中的數據合併到它中。在此表中,我有一個名爲Ack的列,當插入或更新行(我在C#代碼中切換'Y')時,它將切換爲'N'。我遇到的麻煩是當我運行我的查詢時,我只希望Ack在某些更改時更改爲'N'。我試着在WHEN MATCHED語句中添加條件,但當表發生變化時表格從不更新。SQL條件合併匹配更新列不等於

MERGE QA.dbo.SalesOrders AS TARGET USING(SELECT SOD.ORDNUM_28 + 
LINNUM_28 + DELNUM_28 AS [SalesOrd], SOD.PRTNUM_28, PM.PMDES1_01,                                 
SOD.CURDUE_28, SOD.DUEQTY_28, CPD.CUSTPRT_103, SOM.CUSTPO_27, 
CPD.UDFREF_103, CPD.PRTNUM_103,SOD.CreationDate, CM.EMAIL1_23, SOD.ORDNUM_28                                

FROM SO_Detail AS SOD FULL OUTER JOIN                                
Customer_Part_Data AS CPD ON SOD.PRTNUM_28 = CPD.PRTNUM_103 FULL OUTER JOIN                                
SO_Master AS SOM ON SOD.ORDNUM_28 = SOM.ORDNUM_27 FULL OUTER JOIN                                
Part_Master AS PM ON SOD.PRTNUM_28 = PM.PRTNUM_01 FULL OUTER JOIN                                
Customer_Master AS CM ON SOD.CUSTID_28 = CUSTID_23 

WHERE (STATUS_28 = '3') AND (SOD.CreationDate > '09/14/2017') AND 
(CUSTPO_27 <> ' ') AND (SOM.STYPE_27 = 'CU')                                
AND (SOD.STK_28 NOT LIKE '%RMA%') AND (SOD.STYPE_28 = 'CU')) SOURCE 

ON OrderNum = SOURCE.SalesOrd 
WHEN MATCHED AND PartNum <> SOURCE.PRTNUM_28 OR Description <> 
SOURCE.PMDES1_01 OR DueQty <> SOURCE.DUEQTY_28 OR CustPartNum <> 
SOURCE.CUSTPRT_103 OR CustPo <> SOURCE.CUSTPO_27 OR CustRev <> 
SOURCE.UDFREF_103 OR ShipDate <> SOURCE.CURDUE_28 OR email <> 
SOURCE.EMAIL1_23 // This does not work 

THEN 
UPDATE  
SET PartNum = SOURCE.PRTNUM_28, Description = 
SOURCE.PMDES1_01, DueQty = SOURCE.DUEQTY_28, CustPartNum = 
SOURCE.CUSTPRT_103, CustPo = SOURCE.CUSTPO_27, CustRev =       
SOURCE.UDFREF_103, ShipDate = SOURCE.CURDUE_28, email = SOURCE.EMAIL1_23, 
OrgDate = SOURCE.CreationDate, Ack = 'N' 

我的代碼(WHEN MATCHED後一切)什麼行不通指出的那樣 - 沒有錯誤只是當事情改變不更新。如果我在AND之後刪除代碼,那麼所有內容都會更新,但每次運行查詢時都會更新Ack,從而在沒有任何更改時將Ack更改爲「N」。

+1

你將不得不做得比「它不工作」更好。那是什麼意思?這種說法就像是在技工身上放下你的車,並附上一張紙條說「我的車不起作用,請修理它」。 –

回答

0

想通了:我的問題是,我是不理解NULL的受害者。這裏有很好的討論:Why does NULL = NULL evaluate to false in SQL server。基本上,條件不能觸發更新,因爲他們根本不知道答案(NULL)。我需要更新我的INSERT以包含CASE,所以如果值爲NULL - 插入''(一個空白),以便我的條件可以進行比較。

1

隨着一些基本的格式化錯誤變得非常明顯。匹配時,您在謂詞中缺少括號。注意,當這不是sql的牆時,你實際上可以看到發生了什麼。

MERGE QA.dbo.SalesOrders AS TARGET USING 
(
    SELECT SOD.ORDNUM_28 + LINNUM_28 + DELNUM_28 AS [SalesOrd] 
     , SOD.PRTNUM_28 
     , PM.PMDES1_01 
     , SOD.CURDUE_28 
     , SOD.DUEQTY_28 
     , CPD.CUSTPRT_103 
     , SOM.CUSTPO_27 
     , CPD.UDFREF_103 
     , CPD.PRTNUM_103 
     , SOD.CreationDate 
     , CM.EMAIL1_23 
     , SOD.ORDNUM_28                                
    FROM SO_Detail AS SOD 
    FULL OUTER JOIN Customer_Part_Data AS CPD ON SOD.PRTNUM_28 = CPD.PRTNUM_103 
    FULL OUTER JOIN SO_Master AS SOM ON SOD.ORDNUM_28 = SOM.ORDNUM_27 
    FULL OUTER JOIN Part_Master AS PM ON SOD.PRTNUM_28 = PM.PRTNUM_01 
    FULL OUTER JOIN Customer_Master AS CM ON SOD.CUSTID_28 = CUSTID_23 
    WHERE STATUS_28 = '3' 
     AND SOD.CreationDate > '09/14/2017' --Is this a date column? If so you need to use the ANSI standard YYYYmmdd 
     AND CUSTPO_27 <> ' ' 
     AND SOM.STYPE_27 = 'CU'                                
     AND SOD.STK_28 NOT LIKE '%RMA%' 
     AND SOD.STYPE_28 = 'CU' 
) SOURCE 

ON OrderNum = SOURCE.SalesOrd 
WHEN MATCHED 
AND 
(--you need this here 
    PartNum <> SOURCE.PRTNUM_28 
    OR Description <> SOURCE.PMDES1_01 
    OR DueQty <> SOURCE.DUEQTY_28 
    OR CustPartNum <> SOURCE.CUSTPRT_103 
    OR CustPo <> SOURCE.CUSTPO_27 
    OR CustRev <> SOURCE.UDFREF_103 
    OR ShipDate <> SOURCE.CURDUE_28 
    OR email <> SOURCE.EMAIL1_23 --// This does not work 
) --Without the parenthesis the update would fire when ANY of those conditions are met 
THEN 
UPDATE  
SET PartNum = SOURCE.PRTNUM_28 
    , Description = SOURCE.PMDES1_01 
    , DueQty = SOURCE.DUEQTY_28 
    , CustPartNum = SOURCE.CUSTPRT_103 
    , CustPo = SOURCE.CUSTPO_27 
    , CustRev = SOURCE.UDFREF_103 
    , ShipDate = SOURCE.CURDUE_28 
    , email = SOURCE.EMAIL1_23 
    , OrgDate = SOURCE.CreationDate 
    , Ack = 'N' 
+0

謝謝fromatting提示 - 我儘量保持格式更好,但我在Visual Studio中這樣做,它將格式更改回「牆」。我按照你的建議添加了括號,更新仍然不會觸發。只是爲了澄清,當我在聲明中具備條件時,更新永遠不會觸發 - 如果我沒有條件,它總是會觸發。如果滿足其中一個條件,我只希望它觸發並將列Ack更改爲「N」。我肯定知道其中一行應該改變,因爲我引入了一個差異。感謝您關注此 –

+0

我建議將您的sql邏輯移動到存儲過程。然後,您可以對其進行更改,而無需部署代碼。而且你不必處理可怕的格式。 –

+0

至於手頭的問題,我無法幫忙,因爲我沒有任何表格可以使用。我的猜測是,你沒有在OrderNum和SalesOrd上獲得一場比賽,但這是在黑暗中的一個鏡頭。 –