0

我在更新表格时遇到问题。在下面我更新了 column 的标志userdeleted,我还想用 value 更改该行的CurrentTimestamp值,但是在我再放置一个条件之后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 回答