【问题标题】:WHERE IN Subquery - SELECT works but not UPDATE [closed]WHERE IN 子查询 - SELECT 有效但不是 UPDATE [关闭]
【发布时间】:2018-09-01 21:04:47
【问题描述】:

我在 Oracle 上有下表

CREATE TABLE t1(code varchar2(3), flag1 varchar2(30));

INSERT INTO t1(code, flag1) values ('AAA', NULL);    
INSERT INTO t1(code, flag1) values ('BBB', NULL);

下面的选择按预期工作,结果为 1 行

SELECT * 
  FROM t1 
 WHERE code IN (SELECT 'AAA' 
                  FROM DUAL);

但是下面的 Update 语句不起作用(它不会更新任何行)

UPDATE t1
   SET flag1 ='T'
 WHERE code IN (SELECT 'AAA' 
                  FROM DUAL);

我正在 sqlfiddle.com (Oracle 11g) 中运行我的测试。

你知道为什么会这样吗? 我想我在这里遗漏了一些明显的东西..

【问题讨论】:

  • 无法复制,适合我。
  • 你遗漏了一些东西,但我不知道是什么因为 - update 实际上更新 1 行。
  • 无关,但是:子选择完全没用。 where code in ('AAA') 可以正常工作。
  • sqlfiddle 不应该用于测试 IMO,因为它有时与数据库引擎的功能不完全相同
  • @Athafoud SqlFiddle 不会持久化数据,每次运行脚本都会显示结果并回滚

标签: sql oracle11g sql-update


【解决方案1】:

从评论讨论看来,这不是与编程相关的问题,因为我并不完全了解 SQLFiddle 的工作/行为方式。

我错误地运行了命令 (SELECT -> UPDATE -> SELECT),每个命令都是单独运行的,而不是批量运行的。这意味着我的UPDATE 语句的更改在随后的SELECT 中不“可见”。

总结

SqlFiddle 不会持久化数据,每次运行脚本都会显示结果并回滚

特别感谢 Nenad ZivkovicWhatsThePoint 帮助我总结出“解决方案”

【讨论】:

    【解决方案2】:

    尝试使用存在?

    UPDATE t1
       SET flag1 ='T'
    WHERE EXISTS (SELECT 1 
                  FROM DUAL WHERE code = 'AAA');
    

    【讨论】:

    • 子查询返回什么? UPDATE 会更新所有行还是不更新行?
    • 子查询返回一个布尔值。如果为 true,它将更新 code = 'AAA' 的行,否则不会更新。
    • 对于所有 t1 行,如果 DUAL 有一行代码 = 'AAA',则 EXISTS 将为真。如果 DUAL 没有这样的行,则 EXISTS 将始终为假。 IE。要么更新所有 t1 行,要么不更新 t1 行 - 取决于 DUAL 是否有代码 = 'AAA' 行。
    猜你喜欢
    • 2021-12-12
    • 2012-04-18
    • 1970-01-01
    • 2012-10-28
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多