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

解决SQL视图报错#1242:子查询返回多行问题

解决SQL视图报错#1242的修正方案

报错#1242的核心原因是:你SQL里的标量子查询(作为列返回的子查询)返回了多条记录,MySQL要求这种子查询必须只能输出单个值,否则就会触发该错误。

具体修改点

  1. 替换请求人信息的标量子查询为JOIN
    原SQL里获取agente_solicitante_nombre和imagen_perfil_solicitante的子查询,改成直接LEFT JOIN到agentes表(别名s),既避免子查询返回多行的问题,也提升查询效率。

  2. 处理cambio_por子查询的多行返回问题
    第一个UNION块中的cambio_por子查询可能匹配到多条排班记录,用GROUP_CONCAT把所有结果拼接成字符串(贴合展示所有相关排班时间的业务需求);如果只需要单个值,也可以加LIMIT 1限制返回条数。

修正后的完整SQL

SELECT
    `sc`.`id` AS `id`,
    `sc`.`id_agente_solicitado` AS `id_agente_solicitado`,
    `sc`.`id_agente_solicitante` AS `id_agente_solicitante`,
    `sc`.`fecha_solicitada` AS `fecha`,
    `sc`.`horario_solicitado` AS `hora`,
    `sc`.`pendiente` AS `pendiente`,
    '1' AS `tipo`,
    'Cambios de horarios' AS `grupo`,
    '1' AS `grupo_numero`,
    CONCAT(`a`.`nombres`, ' ', `a`.`apellidos`) AS `agente_solicitado_nombre`,
    CONCAT(`s`.`nombres`, ' ', `s`.`apellidos`) AS `agente_solicitante_nombre`,
    `s`.`imagen_perfil` AS `imagen_perfil_solicitante`,
    `a`.`imagen_perfil` AS `imagen_perfil_solicitado`,
    DAYNAME(`sc`.`fecha_solicitada`) AS `nombre_dia`,
    CONCAT(
        CONVERT(DATE_FORMAT(`sc`.`fecha_solicitada`, '%d') USING utf8mb4),
        ' de ',
        CONVERT(MONTHNAME(`sc`.`fecha_solicitada`) USING utf8mb4),
        ' de ',
        CONVERT(DATE_FORMAT(`sc`.`fecha_solicitada`, '%Y') USING utf8mb4)
    ) AS `nombre_mes`,
    (
        SELECT GROUP_CONCAT(' ', `det`.`ingreso`)
        FROM `sigsiste_bd`.`planilla_horarios_det` `det`
        LEFT JOIN `sigsiste_bd`.`planilla_horarios_cab` `cab`
            ON `cab`.`id_planilla_horarios_cab` = `det`.`id_planilla_horarios_cab`
        WHERE
            STR_TO_DATE(
                CONCAT(`cab`.`ano_correspondiente`, ',', `cab`.`mes_correspondiente`, ',', `det`.`dia`),
                '%Y,%m,%d'
            ) = `sc`.`fecha_solicitada`
            AND `sc`.`id_agente_solicitante` = `det`.`id_agente`
    ) AS `cambio_por`
FROM `sigsiste_bd`.`solicitudes_cambio_horario` `sc`
LEFT JOIN `sigsiste_bd`.`agentes` `a`
    ON `a`.`id_agente` = `sc`.`id_agente_solicitado`
LEFT JOIN `sigsiste_bd`.`agentes` `s`
    ON `s`.`id_agente` = `sc`.`id_agente_solicitante`

UNION ALL

SELECT
    `sc`.`id` AS `id`,
    `sc`.`id_agente_solicitado` AS `id_agente_solicitado`,
    `sc`.`id_agente_solicitante` AS `id_agente_solicitante`,
    `sc`.`fecha_cobertura` AS `fecha`,
    `sc`.`horario_cobertura` AS `hora`,
    `sc`.`pendiente` AS `pendiente`,
    '2' AS `tipo`,
    'Coberturas' AS `grupo`,
    '2' AS `grupo_numero`,
    CONCAT(`a`.`nombres`, ' ', `a`.`apellidos`) AS `agente_solicitado_nombre`,
    CONCAT(`s`.`nombres`, ' ', `s`.`apellidos`) AS `agente_solicitante_nombre`,
    `s`.`imagen_perfil` AS `imagen_perfil_solicitante`,
    `a`.`imagen_perfil` AS `imagen_perfil_solicitado`,
    DAYNAME(`sc`.`fecha_cobertura`) AS `nombre_dia`,
    CONCAT(
        CONVERT(DATE_FORMAT(`sc`.`fecha_cobertura`, '%d') USING utf8mb4),
        ' de ',
        CONVERT(MONTHNAME(`sc`.`fecha_cobertura`) USING utf8mb4),
        ' de ',
        CONVERT(DATE_FORMAT(`sc`.`fecha_cobertura`, '%Y') USING utf8mb4)
    ) AS `nombre_mes`,
    '' AS `cambio_por`
FROM `sigsiste_bd`.`solicitudes_cobertura` `sc`
LEFT JOIN `sigsiste_bd`.`agentes` `a`
    ON `a`.`id_agente` = `sc`.`id_agente_solicitado`
LEFT JOIN `sigsiste_bd`.`agentes` `s`
    ON `s`.`id_agente` = `sc`.`id_agente_solicitante`

UNION ALL

SELECT
    `sc`.`id` AS `id`,
    `sc`.`id_agente_solicitado` AS `id_agente_solicitado`,
    `sc`.`id_agente_solicitante` AS `id_agente_solicitante`,
    `sc`.`fecha_devolucion` AS `fecha`,
    `sc`.`horario_devolucion` AS `hora`,
    `sc`.`pendiente` AS `pendiente`,
    '3' AS `tipo`,
    'Devoluciones' AS `grupo`,
    '3' AS `grupo_numero`,
    CONCAT(`a`.`nombres`, ' ', `a`.`apellidos`) AS `agente_solicitado_nombre`,
    CONCAT(`s`.`nombres`, ' ', `s`.`apellidos`) AS `agente_solicitante_nombre`,
    `s`.`imagen_perfil` AS `imagen_perfil_solicitante`,
    `a`.`imagen_perfil` AS `imagen_perfil_solicitado`,
    DAYNAME(`sc`.`fecha_devolucion`) AS `nombre_dia`,
    CONCAT(
        CONVERT(DATE_FORMAT(`sc`.`fecha_devolucion`, '%d') USING utf8mb4),
        ' de ',
        CONVERT(MONTHNAME(`sc`.`fecha_devolucion`) USING utf8mb4),
        ' de ',
        CONVERT(DATE_FORMAT(`sc`.`fecha_devolucion`, '%Y') USING utf8mb4)
    ) AS `nombre_mes`,
    '' AS `cambio_por`
FROM `sigsiste_bd`.`solicitudes_devoluciones` `sc`
LEFT JOIN `sigsiste_bd`.`agentes` `a`
    ON `a`.`id_agente` = `sc`.`id_agente_solicitado`
LEFT JOIN `sigsiste_bd`.`agentes` `s`
    ON `s`.`id_agente` = `sc`.`id_agente_solicitante`

补充说明

如果业务上cambio_por只需要单个值,把GROUP_CONCAT(' ', det.ingreso)改成CONCAT(' ', det.ingreso)并在子查询末尾加LIMIT 1即可。

内容的提问来源于stack exchange,提问作者LUIS TISCORNIA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:43