无法更新表中的列 它返回单行子查询返回多个
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 记录(或没有)。检查您的数据和限制条件。以上是关于无法更新表中的列 它返回单行子查询返回多个的主要内容,如果未能解决你的问题,请参考以下文章