UPDATE SQL SET satu kolom agar sama dengan nilai dalam tabel terkait yang direferensikan oleh kolom yang berbeda?

112

Saya harap itu masuk akal, izinkan saya menjelaskan:

Ada tabel data pelacakan untuk program kuis di mana setiap baris memiliki ..

QuestionID dan AnswerID (masing-masing memiliki tabel). Jadi karena bug ada banyak QuestionID yang disetel ke NULL, tetapi QuestionID dari AnswerID terkait ada di tabel Answers.

Jadi katakanlah QuestionID adalah NULL dan AnswerID adalah 500, jika kita pergi ke tabel Answers dan menemukan AnswerID 500 ada kolom dengan QuestionID yang seharusnya berada di tempat yang memiliki nilai NULL.

Jadi pada dasarnya saya ingin mengatur setiap Kuesioner NULL menjadi sama dengan Kuesioner yang ditemukan di tabel Jawaban pada baris Jawaban dari AnswerID yang ada di tabel pelacakan (baris yang sama dengan Kuesioner NULL yang sedang ditulis).

Bagaimana saya melakukan ini?

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

Tidak yakin bagaimana saya bisa membuatnya menetapkan QuestionID ke QuestionID dari AnswerID yang cocok ...

CloudMeta
sumber
MySQL dan Microsoft SQL Server masing-masing mendukung ekstensi ke sintaks SQL untuk mendukung UPDATE multi-tabel. Merek lain tidak. Anda belum mengatakan merek database apa yang Anda gunakan.
Bill Karwin

Jawaban:

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

Saya sarankan untuk memeriksa apa hasil yang akan diperbarui sebelum menjalankan pembaruan (kueri yang sama, hanya dengan pilihan):

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

Terutama apakah setiap id jawaban pasti hanya memiliki 1 id pertanyaan terkait.

eglasius.dll
sumber
7
Saya tidak yakin mengapa tetapi ini tidak berhasil untuk saya, namun ini berhasil: update QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; tampaknya kueri dasar yang sama dalam urutan yang berbeda. tahu kenapa?
billynoah
2
@billynoah, ORA-00971: kata kunci SET hilang di Oracle
masT
2
Mengalami masalah dengan situasi serupa di PhpMyAdmin melalui MySQL. Dalam kasus saya, kolom sumber dan tujuan berada di tabel yang sama, tetapi pemilihan rekaman didasarkan pada tabel lain. Versi "PILIH" dari kueri berfungsi, tetapi pernyataan UPDTATE menampilkan kesalahan sintaks di "FROM"
2NinerRomeo
3
Saya mengatasi masalah saya dengan menghilangkan "DARI". Terlihat lebih seperti ini:UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition"
2NinerRomeo
apakah "q" dari "update q" dalam jawaban merupakan parameter kueri literal atau hanya singkatan Anda untuk nama tabel?
Shawn
28

Tanpa notasi update-and-join (tidak semua DBMS mendukungnya), gunakan:

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)

Seringkali dalam query seperti ini, Anda perlu mengkualifikasi klausa WHERE dengan klausa EXISTS yang berisi sub-query. Ini mencegah UPDATE menginjak-injak baris di mana tidak ada kecocokan (biasanya membatalkan semua nilai). Dalam kasus ini, karena ID pertanyaan yang hilang akan mengubah NULL menjadi NULL, itu tidak masalah.

Jonathan Leffler
sumber
Metode ini berfungsi untuk saya di Oracle 12c (di mana metode update-join gagal).
shwartz
16

Saya tidak tahu apakah Anda mengalami masalah yang sama dengan saya di MySQL Workbench tetapi menjalankan kueri dengan pernyataan INNER JOINsetelah FROMtidak berhasil untuk saya. Saya tidak dapat menjalankan kueri karena program mengeluh tentang FROMpernyataan tersebut.

Jadi untuk membuat kueri berfungsi, saya mengubahnya menjadi

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

dari pada

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

Saya kira solusi saya adalah sintaks yang tepat untuk MySQL.

AxeEffect
sumber
Ya, sepertinya untuk Mysql, GABUNG dianggap sebagai bagian dari bagian 'table_references' dari sebuah kueri. MySQL Join
AWP
12
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...
Milen A. Radev
sumber
1
Bekerja pada oracle untuk saya. Jawaban @ eglasius tidak.
Lombas
7

Saya mengalami pertanyaan yang sama. Berikut adalah solusi kerja yang mirip dengan eglasius. Saya menggunakan postgresql.

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

Ia mengeluh jika q digunakan sebagai pengganti nama tabel di baris 1, dan tidak ada yang harus mendahului QuestionID di baris 2.

Lighting Minds
sumber
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;
jujur
sumber
3

Untuk Mysql Anda dapat menggunakan Query ini

UPDATE tabel1 a, tabel2 b SET a.coloumn = b.coloumn WHERE a.id = b.id

Samir Patel
sumber
1

Perbarui data tabel ke-2 di tabel ke-1 perlu Inner join sebelum SET:

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;
Santosh Singh
sumber
1

di bawah ini berfungsi untuk mysql

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2
Pravin
sumber
0

Saya pikir ini harus berhasil.

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