SQL UPDATEは、ある列が別の列によって参照される関連テーブルの値と等しくなるように設定しますか?


112

それが理にかなっていると思います。詳しく説明しましょう。

各行のクイズプログラムの追跡データの表があります。

QuestionIDとAnswerID(それぞれにテーブルがあります)。そのため、バグが原因で、NULLに設定された一連のQuestionIDがありましたが、関連するAnswerIDのQuestionIDがAnswersテーブルにあります。

たとえば、Answerテーブルに移動してAnswerID 500を見つけた場合、QuestionIDがNULLでAnswerIDが500だとすると、NULL値があったはずのQuestionIDの列があります。

したがって、基本的には、各NULL QuestionIDを、トラッキングテーブルにあるAnswerIDのAnswer行のAnswersテーブルにある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 ... ?

どのようにして、対応するAnswerIDからQuestionIDにQuestionIDを割り当てることができるかわかりません...


MySQLとMicrosoft SQL Serverはそれぞれ、マルチテーブルUPDATEをサポートするSQL構文の拡張をサポートしています。他のブランドにはありません。使用しているデータベースのブランドを言っていません。
ビルカーウィン

回答:


171
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のみを使用)。

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

特に、各回答IDに関連付けられた質問IDが間違いなく1つしかないかどうか。


7
理由はわかりませんが、これは私にはうまくいきませんが、これはうまくいきupdate QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; ます:同じ基本クエリが異なる順序であるようです。なぜか?
ビリーノア2014

2
@billynoah、ORA-00971:Oracleで欠落しているSETキーワード
マスト

2
MySQLを介したPhpMyAdminで同様の状況に問題がある。私の場合、ソース列と宛先列は同じテーブルにありますが、レコードの選択は他のテーブルに基づいています。クエリの "SELECT"バージョンは機能しますが、UPDTATEステートメントは "FROM"で構文エラーをスローします
2NinerRomeo

3
私はそれがよりこのように見えた「FROM」排除することによって、私の問題を乗り越え:UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition"
2NinerRomeo

回答の「更新q」からの「q」はリテラルクエリパラメーターですか、それともテーブル名の省略形ですか?
Shawn

28

更新と結合の表記がない場合(すべてのDBMSでサポートされているわけではありません)、以下を使用します。

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になります)。この場合、質問IDがないと、NULLがNULLに変更されるため、間違いなく問題になります。


この方法は、Oracle 12cで機能しました(update-joinメソッドが失敗した場合)。
shwartz

16

あなたがMySQLのワークベンチ上の私よりも同じ問題に遭遇したがでクエリを実行した場合、私は知らない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の正しい構文だと思います。


ええ、Mysqlのように見えますが、JOINはクエリの 'table_references'の一部と見なされます。MySQL参加
AWP

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

1
私のためにオラクルに取り組んだ。@eglasiusの答えはそうではありませんでした。
ロンバス2017年

7

同じ質問がありました。これはeglasiusに似た実用的なソリューションです。私はpostgresqlを使用しています。

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

1行目のテーブル名の代わりにqが使用された場合に文句を言い、2行目のQuestionIDの前に何もないはずです。


3
 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;

3

Mysqlの場合、このクエリを使用できます

UPDATE table1 a、table2 b SET a.coloumn = b.coloumn WHERE a.id = b.id


1

SETの前に、1番目のテーブルの2番目のテーブルデータを内部結合に更新する必要があります。

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

1

以下はmysqlで動作します

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

0

これでうまくいくと思います。

UPDATE QuestionTrackings
SET QuestionID = (SELECT QuestionID
                  FROM AnswerTrackings
                  WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
WHERE QuestionID IS NULL
AND AnswerID IS NOT NULL;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.