обновление с ошибкой подзапроса mysql: подзапрос возвращает более 1 строки

0

Я пытаюсь обновить поле "cancelation_date" таблицы заказов с самым текущим полем таблицы history_state_order, но это дает мне ошибку "Subquery возвращает более 1 строки", и я не могу этого сделать, может кто-нибудь просветить меня? Спасибо.

Запрос обновления:

    UPDATE orden o 
SET 
    fecha_cancelacion = (SELECT             
                MAX(CAST(fecha AS DATETIME))
        FROM
            historico_estados_orden h
        WHERE
            o.id_orden = h.id_orden
                AND h.estado_origen = 'OrdenWorkflow/cancelada'
                AND h.estado_fin = ''
                OR h.estado_fin = 'OrdenWorkflow/cancelada'
                AND h.deleted = 0
                AND id_orden NOT IN (3258 , 3221, 3219, 2857, 2836, 2861, 2884, 2878, 3442, 2876)
        GROUP BY h.id_orden)
WHERE
    o.status = 'OrdenWorkflow/cancelada'
        AND o.deleted = 0
        AND o.id_orden NOT IN (3258 , 3221, 3219, 2857, 2836, 2861, 2884, 2878, 3442, 2876);
Теги:
subquery

2 ответа

1
Лучший ответ

Вам не нужно использовать GROUP BY в подзапросе, потому что вы хотите получить только одно максимальное значение:

UPDATE orden o 
SET fecha_cancelacion =
(
    SELECT MAX(CAST(fecha AS DATETIME))
    FROM historico_estados_orden h
    WHERE
        o.id_orden = h.id_orden AND
        h.estado_origen = 'OrdenWorkflow/cancelada' AND
        h.estado_fin IN ('', 'OrdenWorkflow/cancelada') AND
        h.deleted = 0
)
WHERE
    o.status = 'OrdenWorkflow/cancelada' AND
    o.deleted = 0 AND
    o.id_orden NOT IN (3258, 3221, 3219, 2857, 2836, 2861, 2884, 2878, 3442, 2876);

Также обратите внимание, что ограничение на id_orden не должно появляться снова в подзапросе, поскольку оно уже существует во внешнем запросе. Существует условие, что id_orden совпадает между внешним запросом и подзапросом.

0

Сделать LIMIT 1

UPDATE orden o 
SET 
    fecha_cancelacion = (SELECT             
                MAX(CAST(fecha AS DATETIME))
        FROM
            historico_estados_orden h
        WHERE
            o.id_orden = h.id_orden
                AND h.estado_origen = 'OrdenWorkflow/cancelada'
                AND h.estado_fin = ''
                OR h.estado_fin = 'OrdenWorkflow/cancelada'
                AND h.deleted = 0
                AND id_orden NOT IN (3258 , 3221, 3219, 2857, 2836, 2861, 2884, 2878, 3442, 2876)
        GROUP BY h.id_orden LIMIT 1)
WHERE
    o.status = 'OrdenWorkflow/cancelada'
        AND o.deleted = 0
        AND o.id_orden NOT IN (3258 , 3221, 3219, 2857, 2836, 2861, 2884, 2878, 3442, 2876);

Если вам нужен ORDER BY fecha, сделайте так же

Ещё вопросы

Сообщество Overcoder
Наверх
Меню