You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用BKP表替换DGI表两列值时遇单行子查询多行错误,求解决方案

问题原因与解决方案

错误原因

报错Single-row subquery returns more than one row的核心原因是:BKP.EMPLEADO_DEP表中存在同一个RFC对应多条记录的情况,原UPDATE语句的子查询要求每个RFC只能返回一行数据,否则数据库无法确定用哪一行的DEPTO和RAMO来更新目标表。


解决方案

根据BKP表中重复RFC记录的实际情况,选择对应的处理方式:

1. 重复记录的DEPTO/RAMO值完全一致

如果同一RFC的多条记录中,DEPTO和RAMO的值没有差异,直接用DISTINCT去重即可:

UPDATE DGI.EMPLEADO_DEP
SET (DEPTO, RAMO) = (
    SELECT DISTINCT B.DEPTO, B.RAMO
    FROM BKP.EMPLEADO_DEP B
    WHERE B.RFC = DGI.EMPLEADO_DEP.RFC
);

2. 重复记录的DEPTO/RAMO值不同,需指定取数规则

如果同一RFC对应多条不同数据,需要明确取哪一行(比如最新、最早或符合特定条件的记录):

示例1:取最新记录(假设表有时间字段CREATE_DATE)

UPDATE DGI.EMPLEADO_DEP
SET (DEPTO, RAMO) = (
    SELECT B.DEPTO, B.RAMO
    FROM (
        SELECT 
            B.DEPTO, 
            B.RAMO,
            ROW_NUMBER() OVER (PARTITION BY B.RFC ORDER BY B.CREATE_DATE DESC) AS rn
        FROM BKP.EMPLEADO_DEP B
        WHERE B.RFC = DGI.EMPLEADO_DEP.RFC
    ) B
    WHERE B.rn = 1
);

示例2:取任意有效值(用MAX/MIN聚合)

UPDATE DGI.EMPLEADO_DEP
SET (DEPTO, RAMO) = (
    SELECT MAX(B.DEPTO), MAX(B.RAMO)
    FROM BKP.EMPLEADO_DEP B
    WHERE B.RFC = DGI.EMPLEADO_DEP.RFC
);

3. 更安全的MERGE写法

MERGE语句逻辑更清晰,能同时处理匹配/不匹配的情况,还能提前过滤重复记录:

MERGE INTO DGI.EMPLEADO_DEP D
USING (
    -- 先预处理BKP表,确保每个RFC只返回一行
    SELECT 
        RFC,
        DEPTO,
        RAMO,
        ROW_NUMBER() OVER (PARTITION BY RFC ORDER BY CREATE_DATE DESC) AS rn
    FROM BKP.EMPLEADO_DEP
) B
ON (D.RFC = B.RFC)
WHEN MATCHED AND B.rn = 1 THEN
    UPDATE SET D.DEPTO = B.DEPTO, D.RAMO = B.RAMO;

前置验证建议

执行更新前,先排查所有重复的RFC记录,确认处理逻辑:

SELECT RFC, COUNT(*)
FROM BKP.EMPLEADO_DEP
GROUP BY RFC
HAVING COUNT(*) > 1;

内容的提问来源于stack exchange,提问作者ANDREE BERNAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:32:35