2017-03-29 15 views
0

私は一時テーブルにデータを持っており、他の2つのテーブルで重複をチェックしています。見つかったすべての重複に対して、一時テーブル(SET DupFlag = TRUE)にフラグを設定します。私のSELECTステートメントは完璧に動作し、テストするために入力した48の複製のみを返します。しかし、UPDATEとWHERE EXISTSを追加すると、idTempImport2の各レコードはSELECTステートメントから返された48個のレコードではなく、TRUEに設定されます。私の構文は間違っていますか?これは次のようになります。WHERE EXISTSを使用した私のUPDATE文はSELECT文の結果に限定されていません

UPDATE idTempImport2 as tmp2 SET DupFlag = TRUE 
WHERE EXISTS 
(SELECT * FROM idTempImport2 tmp2 
LEFT JOIN (SELECT im.idDate, im.UserID, im.ActionID, im.IsHC, idn.Epic1, idn.Epic2 
     FROM idMain AS im 
     INNER JOIN idNotes AS idn ON im.aID = idn.MainID 
    WHERE idDate BETWEEN "2017-01-02" AND "2017-01-31") AS qry 
ON qry.idDate = tmp2.idDate AND qry.UserID = tmp2.UserID AND qry.ActionID = tmp2.ActionID AND qry.Epic1 = clng(tmp2.Epic1) AND qry.Epic2 = clng(tmp2.Epic2) 
WHERE qry.Epic1 <> NULL); 
+1

あなたがNULLで通過しますが存在することを知っていますか? http://www.techrepublic.com/article/oracle-tip-understand-how-nulls-affect-in-and-exists/ http://stackoverflow.com/questions/5658457/not-equal-operator -null – user2184057

+0

qry.Epic1 <>ここでNULLは、等号<> =!=演算子をNULLに使用しないエラーです。 nullと比較するとIS NULLを使用し、NULLではない – user2184057

+0

これは、更新がselect文の返された結果に限定されないことを意味しますか? – Ginger

答えて

1

私は究極の問題は相関サブクエリが必要だと思うことです。書かれているように、副問合せは外部問合せとの接続がないため、少なくとも1つの行が条件を満たす可能性があります。したがって、すべてが更新されます。

私はあなたが意図だと思う:

UPDATE idTempImport2 as tmp2 
    SET DupFlag = TRUE 
WHERE EXISTS (SELECT im.idDate, im.UserID, im.ActionID, im.IsHC, idn.Epic1, idn.Epic2 
       FROM idMain AS im INNER JOIN 
        idNotes AS idn 
        ON im.aID = idn.MainID 
       WHERE idDate BETWEEN "2017-01-02" AND "2017-01-31" AND 
        im.idDate = tmp2.idDate AND im.UserID = tmp2.UserID AND 
        im.ActionID = tmp2.ActionID AND 
        ?.Epic1 = clng(tmp2.Epic1) AND ?.Epic2 = clng(tmp2.Epic2) 
      ); 
+0

これは完璧に動作します、あなたの助けにゴードンありがとう!それを説明してくれてありがとう。 – Ginger

関連する問題