mysql 错误1242子查询在SQL中返回的行超过1行

yacmzcpb  于 2023-01-08  发布在  Mysql
关注(0)|答案(1)|浏览(169)

我在SQL中有一个视图,当我想打开它时,它会显示以下消息:#1242 -子查询返回的行超过一行。考虑到我的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`,
    (
    SELECT
        CONCAT(
            `sigsiste_bd`.`agentes`.`nombres`,
            ' ',
            `sigsiste_bd`.`agentes`.`apellidos`
        )
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) AS `agente_solicitante_nombre`,
(
    SELECT
        `sigsiste_bd`.`agentes`.`imagen_perfil`
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) 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
        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`
            )
        )
    )
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`,
    (
    SELECT
        CONCAT(
            `sigsiste_bd`.`agentes`.`nombres`,
            ' ',
            `sigsiste_bd`.`agentes`.`apellidos`
        )
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) AS `agente_solicitante_nombre`,
(
    SELECT
        `sigsiste_bd`.`agentes`.`imagen_perfil`
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) 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`
            )
        )
    )
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`,
    (
    SELECT
        CONCAT(
            `sigsiste_bd`.`agentes`.`nombres`,
            ' ',
            `sigsiste_bd`.`agentes`.`apellidos`
        )
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) AS `agente_solicitante_nombre`,
(
    SELECT
        `sigsiste_bd`.`agentes`.`imagen_perfil`
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) 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`
            )
        )
    )

我在SQL中有一个视图,在尝试打开它后,它显示以下消息:#1242 -子查询返回多行。如何更正查询?

ax6ht2ek

ax6ht2ek1#

这是不可能确定的,因为您没有包括足够的细节,但我怀疑错误是由cambio_por的子查询引起的,因为其他子查询似乎是基于PK-

(
    SELECT
        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`

为了测试,您可以尝试将其替换为空字符串,就像您对其他两个选择所做的那样-

'' AS `cambio_por`

三个外部选择中的每一个在选择列表中都有两个子查询,用于基于sc.id_agente_solicitantesigsiste_bd.agentes中检索值。

...
    (
    SELECT
        CONCAT(
            `sigsiste_bd`.`agentes`.`nombres`,
            ' ',
            `sigsiste_bd`.`agentes`.`apellidos`
        )
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) AS `agente_solicitante_nombre`,
(
    SELECT
        `sigsiste_bd`.`agentes`.`imagen_perfil`
    FROM
        `sigsiste_bd`.`agentes`
    WHERE
        (
            `sigsiste_bd`.`agentes`.`id_agente` = `sc`.`id_agente_solicitante`
        )
) AS `imagen_perfil_solicitante`,
...
FROM
    (
        `sigsiste_bd`.`solicitudes_cambio_horario` `sc`
    LEFT JOIN `sigsiste_bd`.`agentes` `a`
    ON
        (
            (
                `a`.`id_agente` = `sc`.`id_agente_solicitado`
            )
        )
    )

会变成

...
CONCAT(`agente_solicitante`.`nombres`, ' ', `agente_solicitante`.`apellidos`) AS `agente_solicitante_nombre`,
`agente_solicitante`.`imagen_perfil` AS `imagen_perfil_solicitante`,
...
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` `agente_solicitante`
    ON `agente_solicitante`.`id_agente` = `sc`.`id_agente_solicitante`

nombre_mes的表达式可以简化-

/* From */
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`,

/* To */
CONVERT(DATE_FORMAT(`sc`.`fecha_solicitada`, '%d de %M de %Y') USING utf8mb4) AS `nombre_mes`,

相关问题