2009-04-01 24 views
79

Tôi hy vọng rằng có ý nghĩa, hãy để tôi giải thích:SQL UPDATE SET một cột bằng với một giá trị trong một bảng có liên quan được tham chiếu bởi một cột khác nhau?

Có một bảng dữ liệu theo dõi cho một chương trình đố trong đó mỗi hàng có ..

QuestionID và AnswerID (có một bảng cho mỗi). Vì vậy, vì một lỗi có một loạt các QuestionID được đặt thành NULL, nhưng QuestionID của một AnswerID có liên quan nằm trong bảng Answers.

Vì vậy, hãy nói QuestionID là NULL và AnswerID là 500, nếu chúng ta đi đến bảng câu trả lời và tìm AnswerID 500 có một cột với QuestionID nên có giá trị NULL. Vì vậy, về cơ bản tôi muốn đặt mỗi QuestionID NULL bằng với QuestionID tìm thấy trong bảng câu trả lời trên hàng trả lời của AnswerID đó là trong bảng theo dõi (cùng hàng với NULL QuestionID đang được viết).

Tôi làm như thế nào?

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

Không chắc thế nào tôi sẽ có thể làm cho nó giao QuestionID đến QuestionID từ AnswerID khớp ...

+0

MySQL và Microsoft SQL Server mỗi phần mở rộng hỗ trợ cho các cú pháp SQL để hỗ trợ đa UPDATE bảng. Các nhãn hiệu khác thì không. Bạn đã không nói những gì thương hiệu của cơ sở dữ liệu bạn đang sử dụng. –

Trả lời

123
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 

Tôi khuyên bạn nên kiểm tra những kết quả thiết lập để cập nhật là trước khi chạy bản cập nhật (cùng một truy vấn, chỉ với một lựa chọn):

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

Cụ thể là mỗi id câu trả lời chắc chắn chỉ có 1 id câu hỏi liên quan.

+6

Tôi nghĩ rằng điều này không hoạt động tại ORACLE: ( –

+5

Tôi không chắc chắn lý do tại sao nhưng điều này không hiệu quả đối với tôi, tuy nhiên điều này có nghĩa là: 'cập nhật QuestionTrackings q tham gia bên trong QuestionAnswers a on q.AnswerID = a.AnswerID đặt q.QuestionID = a.QuestionID; ' có vẻ là cùng một truy vấn cơ bản theo một thứ tự khác .tại sao? – billynoah

+2

@billynoah, ORA-00971: thiếu từ khóa SET trong Oracle – masT

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

Làm việc trên oracle cho tôi. Câu trả lời của @ eglasius thì không. – Lombas

22

Nếu không có các ký hiệu update-và-tham gia (không phải tất cả DBMS hỗ trợ đó), sử dụng:

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) 

Thông thường trong một truy vấn như thế này, bạn cần phải hội đủ điều kiện mệnh đề WHERE với EXISTS khoản có chứa truy vấn phụ. Điều này ngăn chặn UPDATE từ chà đạp trên các hàng mà không có kết quả phù hợp (thường nulling tất cả các giá trị). Trong trường hợp này, vì ID câu hỏi bị thiếu sẽ thay đổi NULL thành NULL, nó được cho là không quan trọng.

7

Tôi đã có cùng một câu hỏi. Đây là một giải pháp làm việc tương tự như của eglasius. Tôi đang sử dụng postgresql.

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

Nó phàn nàn nếu q được sử dụng thay cho tên bảng trong dòng 1, và không có gì nên trước QuestionID phù 2.

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

Tôi không biết nếu bạn đã chạy vào cùng một vấn đề hơn tôi trên MySQL Workbench nhưng chạy truy vấn với INNER JOIN sau khi tuyên bố FROM không hoạt động đối với tôi. Tôi không thể chạy truy vấn vì chương trình đã phàn nàn về câu lệnh FROM.

Vì vậy, để thực hiện công việc truy vấn tôi đã thay đổi nó để

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

thay vì

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

Tôi đoán giải pháp của tôi là đúng cú pháp cho MySQL.

+0

Điều này cũng làm việc cho tôi trên MySQL – nads

1

Cập nhật dữ liệu bảng 2 trong bảng 1 cần phải Inner tham gia trước khi SET:

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`; 
Các vấn đề liên quan