Я изо всех сил пытаюсь решить проблему синтаксиса SQL в запросе Laravel Eloquent. Итак, я вернулся к корню и попытался заставить запрос работать на простом SQL. И я в тупике. Я не эксперт, но меня это сбивает с толку.
Я просмотрел сообщение Обновление с присоединением в SQLite, но я думаю, что оно больше касается проблемы присоединений.
Я тестирую это на SQLLite, который, безусловно, является представителем собственно SQL?
Две таблицы: Инструкции и Знает. Я хочу обновить один столбец в инструкциях "Известно из (последних)". Сделай это правильно, а остальное я смогу решить сам (надеюсь!).
-- This works fine
Select instructions.rowid from instructions
where instructions.EngagementTitle not null
-- This doesn't
UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
WHERE id IN (
SELECT knowns.id
FROM knowns
INNER JOIN instructions
ON knowns.reference = instructions.reference
)
Сообщение об ошибке
no such column: instructions.EngagementTitle:
UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
WHERE id IN (
SELECT knowns.id
FROM knowns
LEFT JOIN instructions
ON knowns.reference = instructions.reference
)
В обеих таблицах есть столбец - проверено трижды.
`EngagementTitle` varchar NOT NULL
Что мне не хватает?
Вне вашего подзапроса instructions не определен. Я думаю, вы ищете UPDATE с соединениями, но я не уверен, поддерживает ли SQLite такой синтаксис, как MySQL.
Возможный дубликат Обновление с присоединением в SQLite
Я думаю, что в основе этого лежит специфика отношений JOIN.


UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
...
Таблица instructions здесь не "известна", только knowns. Объем табличных выражений - только «вниз». Вы можете использовать таблицу, введенную в суперкадре, в подзапросе, но не наоборот.
Попробуйте использовать подзапросы:
UPDATE knowns
SET engagementtitle = (SELECT instructions.engagementtitle
FROM instructions
WHERE instructions.reference = knowns.reference)
WHERE EXISTS (SELECT *
FROM instructions
WHERE instructions.reference = knowns.reference);
Я также заменил ваш WHERE на EXISTS. Думаю, именно этого вы и хотели. Он обновит только строки из knowns, где в instructions есть запись для. То, как вы это сделали, с LEFT JOIN в подзапросе к IN, вы просто обновили бы все строки, поскольку LEFT JOIN включает все строки из левой таблицы, таким образом, все идентификаторы из knowns находятся в результате (возможно, вам нужен INNER JOIN, это сработало бы.).
Но учтите, что для этого не должно быть более одной записи в instructions для одной строки в knowns. Я молча предположил, что это так.
Спасибо, серьезно ... это меня бесконечно беспокоило, и я задавался вопросом о том, что все это "вниз", хотя вы выразились лучше, чем я мог бы. И да, одна инструкция = одна известная верна.
вам нужен
JOIN, если sqllite поддерживаетupdate from join