Обновление SQL устанавливает один столбец равным значению в связанной таблице, на которую ссылается другой столбец?


Я надеюсь, что это имело смысл, позвольте мне уточнить:

существует таблица отслеживания данных для программы викторины, где каждая строка имеет..

QuestionID и AnswerID (есть таблица для каждого). Поэтому из-за ошибки была куча QuestionIDs, установленных в NULL, но QuestionID связанного AnswerID находится в таблице ответов.

Итак, скажем QuestionID равен NULL, а AnswerID равен 500, если мы перейдем к таблице ответов и найдем AnswerID 500, есть столбец с QuestionID, который должен был быть там, где значение NULL.

поэтому в основном я хочу установить каждый NULL QuestionID равным QuestionID, найденному в таблице ответов в строке ответа AnswerID, которая находится в таблице отслеживания (та же строка, что и записываемый NULL QuestionID).

Как бы я это сделал?

UPDATE QuestionTrackings
SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row)
WHERE QuestionID is NULL AND ... ?

Не уверен, как я смогу заставить его назначить QuestionID QuestionID из соответствующего AnswerID...

7 89
sql

7 ответов:

update q
set q.QuestionID = a.QuestionID
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

Я рекомендую проверить, что результирующий набор для обновления перед запуском обновления (тот же запрос, только с выбором):

select *
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

в частности, имеет ли каждый идентификатор ответа определенно только 1 связанный идентификатор вопроса.

без нотации update-and-join (не все СУБД поддерживают это) используйте:

UPDATE QuestionTrackings
   SET QuestionID = (SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
   WHERE QuestionID IS NULL
     AND EXISTS(SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)

часто в таком запросе вам нужно квалифицировать предложение WHERE с предложением EXISTS, содержащим подзапрос. Это предотвращает обновление от вытаптывания строк, где нет совпадения (обычно обнуление всех значений). В этом случае, поскольку отсутствующий идентификатор вопроса изменит значение NULL на NULL, это, возможно, не имеет значения.

UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...

Я не знаю, если вы столкнулись с той же проблемой, что и я на MySQL Workbench, но запускаете запрос с INNER JOIN после FROM заявление не сработало для меня. Я не смог запустить запрос, потому что программа жаловалась на FROM заявление.

поэтому для того, чтобы сделать запрос работать я изменил его на

UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1
SET table1.column2 = table2.column4
WHERE table1.column3 = 'randomCondition';

вместо

UPDATE a
FROM table1 a INNER JOIN table2 b on a.column1 = b.column1
SET a.column2 = b.column4
WHERE a.column3 = 'randomCondition';

Я думаю, что мое решение-это правильный синтаксис для MySQL.

У меня был тот же вопрос. Вот рабочее решение, которое похоже на эгласия. Я использую postgresql.

UPDATE QuestionTrackings
SET QuestionID = a.QuestionID
FROM QuestionTrackings q, QuestionAnswers a
WHERE q.QuestionID IS NULL

Он жалуется, если q был использован вместо имени таблицы в строке 1, и ничто не должно предшествовать QuestionID в строке 2.

 select p.post_title,m.meta_value sale_price ,n.meta_value   regular_price
    from  wp_postmeta m 
    inner join wp_postmeta n
      on m.post_id  = n.post_id
    inner join wp_posts p
      ON m.post_id=p.id 
    and m.meta_key = '_sale_price'
    and  n.meta_key = '_regular_price'
     AND p.post_type = 'product';



 update  wp_postmeta m 
inner join wp_postmeta n
  on m.post_id  = n.post_id
inner join wp_posts p
  ON m.post_id=p.id 
and m.meta_key = '_sale_price'
and  n.meta_key = '_regular_price'
 AND p.post_type = 'product'
 set m.meta_value = n.meta_value;

обновление данных 2-й таблицы в 1-й таблице необходимо внутреннее соединение перед набором :

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;