Каков правильный синтаксис SQL?

Я изо всех сил пытаюсь решить проблему синтаксиса 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

Что мне не хватает?

вам нужен JOIN, если sqllite поддерживает update from join

maSTAShuFu 05.06.2018 02:51

Вне вашего подзапроса instructions не определен. Я думаю, вы ищете UPDATE с соединениями, но я не уверен, поддерживает ли SQLite такой синтаксис, как MySQL.

Phil 05.06.2018 02:52

Возможный дубликат Обновление с присоединением в SQLite

Phil 05.06.2018 02:52

Я думаю, что в основе этого лежит специфика отношений JOIN.

Maxcot 05.06.2018 05:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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. Я молча предположил, что это так.

Спасибо, серьезно ... это меня бесконечно беспокоило, и я задавался вопросом о том, что все это "вниз", хотя вы выразились лучше, чем я мог бы. И да, одна инструкция = одна известная верна.

Maxcot 05.06.2018 03:17

Другие вопросы по теме