SQL UPDATE УСТАНОВИТЬ один столбец равным значению в связанной таблице, на которую ссылается другой столбец? - PullRequest
102 голосов
/ 02 апреля 2009

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

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

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

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

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

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

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 ...

Ответы [ 9 ]

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

25 голосов
/ 02 апреля 2009

Без нотации 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, это, возможно, не имеет значения.

15 голосов
/ 10 сентября 2015

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

12 голосов
/ 02 апреля 2009
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...
7 голосов
/ 01 декабря 2011

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

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

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

3 голосов
/ 01 марта 2015
 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;
1 голос
/ 08 мая 2019

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

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

1 голос
/ 21 сентября 2016

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

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;
0 голосов
/ 16 февраля 2019

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

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...