Я пытаюсь обновить поле "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);
Вам не нужно использовать 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
совпадает между внешним запросом и подзапросом.
Сделать 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, сделайте так же