Решение проблемы
Я думаю, что вы можете значительно улучшить этот код, но поскольку он «не работает», я считаю, что ваша проблема коренится в вашей ANDлогике. То, что у вас есть в вашем вопросе, в основном говорит UPDATE 3 things WHEN condition A AND condition B AND condition C, что это означает, что этот запрос ничего не сделает, если ВСЕ ТРИ части вашего WHEREпредложения не верны. Если я правильно понимаю вашу проблему, то на самом деле вы намереваетесь обновить каждый столбец независимо от остальных, например, если r.FULLNAMEон отсутствует, но f.FULLNAMEприсутствует, вы хотите обновить это поле независимо от того, r.PRODUCERсоответствует r.ADDRESSли оно критериям.
Что касается исправления вашего запроса, если я правильно понял вашу проблему, я думаю, что следующее сделает то, что вы хотите:
UPDATE RESTS r
INNER JOIN FORMS f
ON r.ID = f.ID
SET r.FULLNAME=coalesce(NULLIF(r.FULLNAME, ''), NULLIF(f.FULLNAME,''))
, r.PRODUCER=coalesce(NULLIF(r.PRODUCER,''), NULLIF(f.PRODUCER,''))
, r.ADDRESS=coalesce(NULLIF(r.ADDRESS,''), NULLIF(f.ADDRESS,''));
Первые три строки, я думаю, говорят сами за себя, вы объединяете две таблицы на основе общего идентификатора. Это убирает повторные r.id = f.idпроверки в вашем запросе. В остальном:
NULLIF(r.FULLNAME, '')возвращает,NULLеслиr.FULLNAME = '', в противном случае возвращает значениеr.FULLNAME.coalesce(NULLIF(r.ADDRESS,''), NULLIF(f.ADDRESS,''))- возвращает первое незначениеNULLв списке.SET r.FULLNAME=coalesce(NULLIF(r.FULLNAME, ''), NULLIF(f.FULLNAME,''))будетSET r.FULLNAME =к первому значению, которое не равноNULLили''.
Я считаю, что это удовлетворило всем критериям, которые вы пытались выразить в своих WHEREпунктах, но прокомментируйте, если вы думаете, что я что-то упустил.
Вот скрипка из вышеперечисленного: ссылка
Комментариев нет:
Отправить комментарий