0

テーブルの更新に問題があります。以下では、 column のフラグを更新userdeletedしています。その行の値を value で変更したいのですCurrentTimestampが、 にもう 1 つの条件を配置した後SET、すべての行の値が現在のタイムスタンプに更新されます。

UPDATE dpuserapplication t1 
LEFT OUTER JOIN temp_userapplication t2
ON t1.userName = t2.userName
AND t1.ApplicationName = t2.ApplicationName
AND t1.groupName = t2.groupName
SET t1.userDeleted = CASE WHEN t2.ID IS NULL THEN 1 ELSE 0 END,
t1.CreatedDate = CURRENT_TIMESTAMP;
4

1 に答える 1

0

これは、句を指定しない限りLEFT OUTER JOINのすべての行を返すが原因で発生します。タイムスタンプを変更するための条件を指定しないため、各行で変更されます。dpuserapplicationWHERE

条件を追加してみてください:

UPDATE dpuserapplication t1
       LEFT OUTER JOIN temp_userapplication t2
                    ON t1.username = t2.username
                       AND t1.applicationname = t2.applicationname
                       AND t1.groupname = t2.groupname
SET    t1.userdeleted = CASE
                          WHEN t2.id IS NULL THEN 1
                          ELSE 0
                        END,
       t1.createddate = CASE
                          WHEN t2.id IS NOT NULL THEN CURRENT_TIMESTAMP
                          ELSE t1.createddate
                        END;  

このフィドルを参照してください。

userdeletedコメントの後、 1 に設定され、現在は 0 に設定されている行のみを更新する場合:

UPDATE dpuserapplication t1
       LEFT OUTER JOIN temp_userapplication t2
                    ON t1.username = t2.username
                       AND t1.applicationname = t2.applicationname
                       AND t1.groupname = t2.groupname
SET    t1.userdeleted = CASE
                          WHEN t2.id IS NULL THEN 1
                          ELSE 0
                        END,
       t1.createddate = CASE
                          WHEN t2.id IS NOT NULL AND t1.userdeleted = 1 THEN CURRENT_TIMESTAMP
                          ELSE t1.createddate
                        END;  

このフィドルを参照してください。

このフィドルで:

  • u1 は userdeleted = 1 ですが、条件を満たしています。そのステータスは 0 に変更され、日付が更新されます。
  • u2 は userdeleted = 0 であり、条件に適合します。そのステータスは 0 (変更なし) に設定されますが、日付は更新されません。
  • u3 は条件に適合しません。何も起こりません。
于 2013-06-20T07:31:24.497 に答える