SQL GÜNCELLEME Bir sütun, farklı bir sütun tarafından başvurulan ilgili tablodaki bir değere eşit olacak mı?


112

Umarım bu mantıklıdır, ayrıntılarıyla açıklayayım:

Her satırın sahip olduğu bir test programı için izleme verileri tablosu vardır.

Soru Kimliği ve Cevap Kimliği (her biri için bir tablo vardır). Bu nedenle, bir hata nedeniyle NULL olarak ayarlanmış bir grup Soru Kimliği vardı, ancak ilgili bir AnswerID'nin Soru Kimliği Yanıtlar tablosunda.

Diyelim ki QuestionID NULL ve AnswerID 500, Cevaplar tablosuna gidip AnswerID 500'ü bulursak, NULL değerinin olduğu yerde olması gereken Soru Kimliği olan bir sütun var.

Bu nedenle, temel olarak, her NULL Soru Kimliğini, izleme tablosundaki AnswerID'nin Yanıt satırındaki Yanıtlar tablosunda bulunan Soru Kimliği'ne eşit olacak şekilde ayarlamak istiyorum (yazılmakta olan NULL Soru Kimliği ile aynı satır).

Bunu nasıl yaparım?

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

Soru Kimliği'ni, eşleşen AnswerID'den Soru Kimliği'ne nasıl atayabileceğimden emin değilim ...


MySQL ve Microsoft SQL Server, çoklu tablo GÜNCELLEMESİNİ desteklemek için SQL sözdizimine uzantıları destekler. Diğer markalar yapmaz. Hangi marka veritabanı kullandığınızı söylemediniz.
Bill Karwin

Yanıtlar:


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

Güncellemeyi çalıştırmadan önce güncellenecek sonuç kümesinin ne olduğunu kontrol etmenizi öneririm (aynı sorgu, yalnızca bir seçimle):

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

Özellikle her yanıt kimliğinin kesinlikle yalnızca 1 ilişkili soru kimliği olup olmadığı.


7
Neden olduğundan emin değilim ama bu benim için çalışmıyor, ancak bu işe yarıyor: update QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; farklı bir sırada aynı temel sorgu gibi görünüyor. herhangi bir fikriniz neden?
billynoah

2
@billynoah, ORA-00971: Oracle'da eksik SET anahtar sözcüğü
masT

2
MySQL üzerinden PhpMyAdmin'de benzer bir durumla ilgili bir sorun yaşıyorsanız. Benim durumumda, kaynak ve hedef sütunlar aynı tablodadır, ancak kayıt seçimi diğer tabloya dayanmaktadır. Sorgunun "SELECT" sürümü çalışıyor, ancak UPDTATE ifadesi "FROM" adresinde bir sözdizimi hatası veriyor
2NinerRomeo 04

3
UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition"
Sorunumu

yanıttaki "güncelleme q" dan "q" değişmez bir sorgu parametresi mi yoksa bir tablo adı için kısayolunuz mu?
Shawn

28

Güncelle ve birleştir gösterimi olmadan (tüm DBMS desteklemez), şunu kullanın:

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)

Genellikle böyle bir sorguda, WHERE yan tümcesini alt sorguyu içeren bir EXISTS yan tümcesi ile nitelendirmeniz gerekir. Bu, GÜNCELLEME'nin eşleşme olmayan satırları ayaklar altına almasını önler (genellikle tüm değerleri geçersiz kılar). Bu durumda, eksik bir soru kimliği NULL'u NULL olarak değiştireceğinden, muhtemelen önemli değildir.


Bu yöntem benim için Oracle 12c'de çalıştı (güncelleme-birleştirme yönteminin başarısız olduğu).
shwartz

16

MySQL Workbench'te benimle aynı problemle karşılaşıp karşılaşmadığınızı bilmiyorum ama sorguyu ifadesinden INNER JOINsonra çalıştırmak FROMbenim için işe yaramadı. Program FROMifadeden şikayet ettiği için sorguyu çalıştıramadım .

Bu yüzden sorgunun çalışmasını sağlamak için onu

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

onun yerine

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

Sanırım benim çözümüm MySQL için doğru sözdizimi.


Evet, Mysql'e benziyor, JOIN sorgunun 'table_references' kısmının bir parçası olarak kabul edilir. MySQL Join
AWP

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

1
Benim için oracle üzerinde çalıştı. @ eglasius'un cevabı olmadı.
Lombas

7

Ben de aynı soruyu soruyordum. İşte eglasius'unkine benzer bir çalışma çözümü. Postgresql kullanıyorum.

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

1. satırda tablo adı yerine q kullanılmasından ve 2. satırda Soru Kimliği'nin önüne hiçbir şeyin gelmemesinden şikayet eder.


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 için bu Sorguyu kullanabilirsiniz

GÜNCELLEME table1 a, table2 b SET a.coloumn = b.coloumn NEREDE a.id = b.id


1

1. tablodaki 2. tablo verilerini güncellemek, SET'ten önce iç birleştirme gerekir:

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

1

mysql için çalışır

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

0

Bunun işe yarayacağını düşünüyorum.

UPDATE QuestionTrackings
SET QuestionID = (SELECT QuestionID
                  FROM AnswerTrackings
                  WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
WHERE QuestionID IS NULL
AND AnswerID IS NOT NULL;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.