Firebird: Как сделать запрос sql на изменение в связанной таблице
У меня есть таблицы PAYMENT и GENAGENT. В таблице PAYMENT находится ссылка на таблицу GENAGENT имя поля - REF_GENAGENT.
Я хочу изменить значение поле NAME таблицы GENAGENT. Но получаю ошибку:
SQLSTATE[HY000]: General error: -104 Dynamic SQL Error SQL error code = -104 Token unknown - line 2, column 1 INNER (SQL:
UPDATE PAYMENT INNER JOIN GENAGENT on PAYMENT.REF_GENAGENT = GENAGENT.GENAGENT_ID set GENAGENT.NAME = 'SSS' where REF_GENAGENT=3)
мой запрос:
$pay = DB::select("UPDATE PAYMENT
JOIN GENAGENT on PAYMENT.REF_GENAGENT = GENAGENT.GENAGENT_ID
set GENAGENT.NAME = 'SSS' where REF_GENAGENT = 3");
Использую БД firebird.
Ответы (1 шт):
В СУБД Firebird, как собственно и в стандарте SQL конструкция UPDATE может быть выполнена только над одной таблицей, а не соединением или объединением.
Maestro в комментариях вам ответил.
UPDATE GENAGENT set NAME = 'SSS' where GENAGENT_ID=3
Если вам нужно выполнить действие только в том случае, если есть запись в PAYMENT (inner join отсечёт записи без связи), то можно выполнить ещё и дополнительную проверку существования:
UPDATE GENAGENT G set NAME = 'SSS'
WHERE G.GENAGENT_ID=3
AND EXISTS(SELECT * FROM PAYMENT P WHERE P.REF_GENAGENT = G.GENAGENT_ID)
Также ваш запрос можно перевести на синтаксис firebird через подзапрос:
UPDATE GENAGENT G SET NAME = 'SSS'
WHERE G.GENAGENT_ID IN (SELECT P.REF_GENAGENT FROM PAYMENT P WHERE P.REF_GENAGENT = 3)
Если ваша тройка была выбрана в интерфейсе из таблицы PAYMENT, то выражение в скобках может дать только одно значение 3, и заменив IN (…) на = 3 мы и получим первый ответ.
Если же тройка может и отсутствовать в таблице PAYMENT, но есть индекс по полю REF_GENAGENT, то оптимизатор заменит запрос с IN на запрос с EXISTS, который я привёл вторым.