更新语句因 ORA-01427 失败 - 已更新

问题描述 投票:0回答:2

我有两张桌子,见下文。我需要将 table1.sample1 更新为与 table2.sample2 相同,其中 table1.level1=table2.level2。 在此输入图片描述

我尝试的更新给了我

ORA-01427-单行子查询返回多于一行。

UPDATE table1
SET sample1 = 
   (SELECT table2.sample2
    FROM table1, table2
    WHERE table1.level1=table2.level2 and table1.sample1 is null); 
sql oracle sql-update oracle19c
2个回答
0
投票

您遇到的错误 (ORA-01427) 是因为您的子查询返回多行,而 UPDATE 语句只能为某一列分配单个值。

要根据 table2.sample2 中的相应值更新 table1.sample1,可以使用 JOIN 而不是子查询。具体方法如下:

通过 join 使用更新

 UPDATE table1 t1
SET sample1 = (
    SELECT t2.sample2
    FROM table2 t2
    WHERE t1.level1 = t2.level2
)
WHERE t1.sample1 IS NULL;

0
投票

您想使用相关子查询:

UPDATE table1
SET sample1 = ( SELECT table2.sample2
                FROM   table2
                WHERE  table1.level1=table2.level2)
WHERE sample1 IS NULL;

对于样本数据:

CREATE TABLE table1 (sample1, level1) AS
SELECT NULL, 100 FROM DUAL UNION ALL
SELECT NULL, 200 FROM DUAL UNION ALL
SELECT NULL, 200 FROM DUAL UNION ALL
SELECT NULL, 200 FROM DUAL UNION ALL
SELECT NULL, 300 FROM DUAL UNION ALL
SELECT NULL, 300 FROM DUAL UNION ALL
SELECT NULL, 400 FROM DUAL UNION ALL
SELECT 8, 800 FROM DUAL UNION ALL
SELECT 9, 900 FROM DUAL UNION ALL
SELECT 10, 900 FROM DUAL;

CREATE TABLE table2 (sample2, level2) AS
SELECT LEVEL, LEVEL * 100 FROM DUAL CONNECT BY LEVEL <= 10;

那么,更新后,该表包含:

样品1 1级
1 100
2 200
2 200
2 200
3 300
3 300
4 400
8 800
9 900
10 900

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.