Я получаю сообщение об ошибке в моем ниже запросе mysql. Обратите внимание, что мой подзапрос должен быть возвращен 1627862. Есть ли способ разобраться с этой ошибкой при сохранении всех условий подзапроса?
UPDATE SUBSCRIPTION_LOG
SET SUBSCRIPTION_STATUS='D',
DEACTIVATION_DATE=NOW(),
DEACTIVATION_CHANNEL='SYSTEM'
WHERE SUBSCRIPTION_STATUS ='A'
AND SHORT_CODE='22222'
AND MSISDN =(SELECT MSISDN
FROM SUBSCRIPTION
WHERE DATEDIFF(NOW(),'ACTIVATION_DATE') > LAST_CHARGED_VALIDITY
AND OFFER_CODE NOT IN ('CAT_228','CAT_229','CAT_232','CAT_233')
AND SHORT_CODE = '22222');
ОШИБКА 1242 (21000): Подзапрос возвращает более 1 строки
Значение equal =
в вашей MSISDN commpare ожидает, что ваш подзапрос возвращает одно значение, но в подзапросе возвращается несколько строк. Чтобы ваш запрос работал, измените =
на " ìn
ниже
UPDATE SUBSCRIPTION_LOG SET SUBSCRIPTION_STATUS='D', DEACTIVATION_DATE=NOW(),
DEACTIVATION_CHANNEL='SYSTEM' WHERE SUBSCRIPTION_STATUS ='A'
AND SHORT_CODE='22222'
AND MSISDN in (SELECT MSISDN
FROM SUBSCRIPTION
WHERE DATEDIFF(NOW(),'ACTIVATION_DATE') > LAST_CHARGED_VALIDITY
AND OFFER_CODE NOT IN ('CAT_228','CAT_229','CAT_232','CAT_233')
AND SHORT_CODE = '22222');
Посмотрите, работает ли это.
Вы можете написать это как соединение обновления:
UPDATE SUBSCRIPTION_LOG sl
INNER JOIN SUBSCRIPTION s
ON sl.MSISDN = s.MSIDSN
SET sl.SUBSCRIPTION_STATUS = 'D',
sl.DEACTIVATION_DATE = NOW(),
sl.DEACTIVATION_CHANNEL = 'SYSTEM'
WHERE
sl.SUBSCRIPTION_STATUS = 'A' AND
sl.SHORT_CODE = '22222' AND
DATEDIFF(NOW(), s.ACTIVATION_DATE) > s.LAST_CHARGED_VALIDITY AND
s.OFFER_CODE NOT IN ('CAT_228','CAT_229','CAT_232','CAT_233') AND
s.SHORT_CODE = '22222';
Column 'SUBSCRIPTION_STATUS' in field list is ambiguous
.
SET
, чтобы ссылаться на первую (целевую) таблицу.
IN
. Равен требует, чтобы одно значение было возвращено.