无法更新表中的列 它返回单行子查询返回多个

Posted

技术标签:

【中文标题】无法更新表中的列 它返回单行子查询返回多个【英文标题】:cant update a column from table it returns single-row subquery returns more than one 【发布时间】:2017-11-24 16:05:06 【问题描述】:

当我执行以下查询时,我收到类似

的消息

Ora-01427 单行子查询返回多行

我正在尝试从另一个表更新表 A 中的“城市”列。 我该怎么做?

    表A:名称,PER_code(也有重复值或空值),城市,PD_code 表 B:姓名、PER_code(无重复值,可能为空)、城市、邮政编码

更新声明:

UPDATE A
SET (A.city) =
(SELECT B.city
FROM B
INNER JOIN A
ON A.per_code=B.per_code 
WHERE A.per_code is not null)

【问题讨论】:

【参考方案1】:

由于存在重复值但您只选择了一个字段,因此您修改了查询

UPDATE A SET (A.city) = (SELECT B.city FROM B INNER JOIN A ON 
A.per_code=B.per_code WHERE A.per_code is not null)

UPDATE A SET (A.city) = (SELECT DISTINCT B.city FROM B INNER JOIN A ON 
A.per_code=B.per_code WHERE A.per_code is not null)

如果在表 B 中重复,distinct 运算符将允许您保留单个值。如果有多个不同的值,您将不得不查看您的数据并决定应该在另一个中使用哪个值表。

【讨论】:

【参考方案2】:

您也可以尝试MERGE INTO 选择DISTINCT 记录。

MERGE INTO A d
USING
( SELECT DISTINCT per_code, city FROM B ) s 
ON ( s.per_code = d.per_code ) 
WHEN MATCHED THEN UPDATE SET d.City = s.City 
WHERE d.per_code IS NOT NULL;

【讨论】:

【参考方案3】:

我认为您打算使用相关子查询:

UPDATE A
    SET city = (SELECT B.city
                FROM B 
                WHERE A.per_code = B.per_code
               )
    WHERE A.per_code is not null;

编辑:

鉴于原始问题中的限制,上述内容应该有效。如果没有,它很容易适应:

UPDATE A
    SET city = (SELECT B.city
                FROM B 
                WHERE A.per_code = B.per_code AND rownum = 1
               )
    WHERE A.per_code is not null;

【讨论】:

谢谢,我也试试这个,但又遇到 Ora-01427 错误。 @user8165653:这不可能。您说 per_code 在表 B 中没有重复项,因此对于一个 per_code 您应该得到一个 B 记录(或没有)。检查您的数据和限制条件。

以上是关于无法更新表中的列 它返回单行子查询返回多个的主要内容,如果未能解决你的问题,请参考以下文章

子查询返回超过 1 个值 - 我的触发器无法处理多个行更新

使用子查询更新语句

更新语句中的“单行子查询返回多行”

ORA-01427: 单行子查询返回多行更新

ORA-01427:单行子查询返回多个行

ORA-01427:单行子查询返回多个行