我试图了解我在Toad for Oracle 12.1中编写的查询结果。
我的测试表包含3列:
EMPID LOGGEDIN CURRENT_MONITOR
00001 1 1
00002 1
00003 1
00004 2
以下SQL将更新该表,以便将CURRENT_MONITOR中的值从一个用户交换到另一个用户(在这种情况下,从'00001'到'00003'):
UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR =
CASE
WHEN EMPID = '00001' THEN NULL
WHEN EMPID = '00003' THEN 1
END
WHERE LOGGEDIN = 1;
运行此命令时,Toad返回消息,指出已更新3行。我了解到有3条匹配记录,其中LOGGEDIN为1,但是我想知道为什么Toad不声明2条记录已更新。这是因为它需要遍历WHERE子句返回的结果来执行更新吗?感谢您的提前帮助。
答案 0 :(得分:4)
您可以在WHERE
子句中添加逻辑,这也限制了EMPID
的值:
UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR =
CASE
WHEN EMPID = '00001' THEN NULL
WHEN EMPID = '00003' THEN 1
END
WHERE
LOGGEDIN = 1 AND
EMPID IN ('00001', '00003');
另一种方法是在ELSE
表达式中添加一个CASE
条件,该条件实际上是不执行操作,只是将CURRENT_MONITOR
重新分配给自身:
UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR =
CASE
WHEN EMPID = '00001' THEN NULL
WHEN EMPID = '00003' THEN 1
ELSE CURRENT_MONITOR
END
WHERE LOGGEDIN = 1;