Обновление 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 ответов:
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;