2017-09-26 22 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' 

私は(MATCHED WHEN後にすべてを)動作しませんどのようなコードで指摘 - 何かが変更されたときにエラーがちょうど更新されません。 ANDの後にコードを削除すると、すべてが更新されますが、クエリが実行されるたびに変更されるため、Ackが実際に変更されていないときに「N」に変更されます。

+1

"それはうまくいかない"よりもうまくやらなくてはなりません。どういう意味ですか?その声明は、「私の車は動かない、修正してください」というメモをつけて整備士に車を降ろすようなものです。 –

答えて

0

わかりました:私の問題は、NULLを理解していないという犠牲者です。ここで良い議論が見つかりました:Why does NULL = NULL evaluate to false in SQL server。基本的には、単純に答えを知らなかったため(NULL)、条件が更新を起動できませんでした。 CASEを含めるようにINSERTを更新する必要がありました。値が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

ヒントのヒント - 私はより良い書式を維持しようとするが、私はVisual Studioでこれをやっているし、 "壁"にフォーマットを変更します。あなたが推奨するようにカッコを追加しましたが、アップデートはまだ起動しません。明確にするために、私が声明の条件を持っているとき、更新は決して起きません - 条件がない場合は、常にそれが発生します。条件の1つが満たされている場合、列Ackを「N」に変更するだけです。私は違いを導入しているので、行のうちの1つが変わるはずです。これにご関心をお寄せいただきありがとうございます –

+0

私はストアドプロシージャにSQLロジックを移動することをお勧めします。次に、コードをデプロイせずに変更を加えることができます。そしてあなたは恐ろしいフォーマットに対処する必要はありません。 –

+0

手元にある問題に関しては、私は仕事をするテーブルがないので、おそらく助けになることはありません。私の推測では、あなたはOrderNumとSalesOrdにマッチしていないのですが、それは暗闇の中のショットです。 –

関連する問題