Какой правильный синтаксис SQL? - PullRequest
0 голосов
/ 05 июня 2018

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

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

1 Ответ

0 голосов
/ 05 июня 2018
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, это сработало бы.).

Но обратите внимание, что для работы одной строки в knowns не должно быть более одной записи в instructions.Я молча предположил, что это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...