不能只更新 1 行。如何更改 1 行?

Can't update only 1 row. How to change 1 row?

我发现 Oracle 不支持 LIMIT 子句,这与 MySQL 不同,并且只更新 table 中的 1 行 i'我试过这个:

UPDATE "Schedule" 
   SET "Position" = 'Manager' 
 WHERE "Position" IN 
       (SELECT "Position" 
          FROM "Schedule" 
         WHERE "Position"='Tester' 
         OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY);

并更新了 3 行。

当我 运行 这个:

SELECT "Position" 
  FROM "Schedule" 
 WHERE "Position"='Tester' 
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

我只得到一行(应该是)。

但是更新 1 行并没有像我之前提到的那样工作。是否有任何其他方法可以仅更新 1 个特定行?

只要您的数据库版本至少为 12c,您只需要一点点,通过将 WHERE Position IN (SELECT Position 部分替换为 WHERE ID IN (SELECT ID 部分作为主列进行更改。当前案例没有任何意义,因为所有测试人员都将转换为经理,甚至将 IN <subquery> 替换为 ='Tester'。因此,通过删除双引号

使用以下更新语句
UPDATE Schedule
   SET Position = 'Manager'
 WHERE ID IN
       (SELECT ID
          FROM Schedule
         WHERE Position = 'Tester'
         FETCH NEXT 1 ROW ONLY);

Demo

理想情况下,您的 "Schedule" table 会有一个主键,您将使用它来执行更新。假设 "Schedule" 没有主键,您可以使用 ROWID:

UPDATE "Schedule" 
  SET "Position" = 'Manager' 
  WHERE ROWID IN (SELECT ROWID
                    FROM "Schedule" 
                    WHERE "Position" = 'Tester' 
                    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY);

请注意,像这样使用 ROWID 是一种非常糟糕的做法,所有 table 都应在创建时指定一个主键,以便可以可靠地找到各个行。要使一列或一组列成为有效的主键,它们必须是 A) 非 NULL,B) 唯一,以及 C) 不变。

此外 - 我强烈建议您养成使用 table 和不需要引用的列的名称的习惯。带引号的标识符是出现语法错误的机会,这些错误无助于让您的生活更美好。如果您创建一个名为 SCHEDULE 的 table,您仍然可以将其称为 ScheduleScHeDuLeschedule 或任何其他大小写字母组合您愿意在代码中使用。