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

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

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

QuestionID и AnswerID (для каждой таблицы есть таблица). Поэтому из-за ошибки была собрана множество идентификаторов QuestionID, заданных в NULL, но QuestionID соответствующего идентификатора ответа находится в таблице "Ответы" .

Так что sayIDID равен NULL, а AnswerID - 500. Если мы перейдем к таблице "Ответы" и найдем answerID 500, есть столбец с QuestionID, где должно быть значение NULL.

Итак, в основном я хочу, чтобы каждый NULL QuestionID был равен QuestionID, найденному в таблице "Ответы" в строке "Ответ", которая находится в таблице отслеживания (той же строке, что и 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...

Ответ 1

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 связанный идентификатор вопроса.

Ответ 2

Без нотации 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, которое содержит подзапрос. Это предотвращает перетаскивание UPDATE по строкам, где нет совпадения (обычно обнуление всех значений). В этом случае, поскольку отсутствующий идентификатор вопроса изменит значение NULL на NULL, это, возможно, не имеет значения.

Ответ 3

Я не знаю, столкнулась ли вы с той же проблемой, чем я, на 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.

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

 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;

Ответ 7

Для Mysql Вы можете использовать этот запрос

ОБНОВЛЕНИЕ table1 a, table2 b SET a.coloumn = b.coloumn ГДЕ a.id = b.id

Ответ 8

Обновление данных второй таблицы в 1-й таблице необходимо для внутреннего соединения до SET:

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

Ответ 9

ниже работает для MySQL

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2

Ответ 10

Я думаю, что это должно работать.

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