Làm cách nào để CẬP NHẬT khi tham gia các bảng trên SQLite?


92

Tôi đã thử:

UPDATE closure JOIN item ON ( item_id = id ) 
SET checked = 0 
WHERE ancestor_id = 1

Và:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id

Cả hai đều hoạt động với MySQL, nhưng chúng khiến tôi gặp lỗi cú pháp trong SQLite.

Làm cách nào để CẬP NHẬT / THAM GIA này hoạt động với SQLite phiên bản 3.5.9?


Điều này đã được trả lời bằng cách stackoverflow.com/questions/3845718/...
Ivelin Nikolaev

Câu trả lời:


128

Bạn không thể. SQLite không hỗ trợ các JOIN trong các câu lệnh UPDATE .

Tuy nhiên, bạn có thể thực hiện việc này bằng một truy vấn con:

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1);

Hoặc điều tương tự; không rõ chính xác lược đồ của bạn là gì.


20
Điều này bắt đầu xuất hiện khi điều bạn cần làm là sao chép một cột từ bảng này sang bảng khác để đảo ngược hướng của một liên kết. trong MySQL, bạn có thể làm điều gì đó như tạo cột foos.bar_id, sau update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idđó thả cột bar.foo_id ... làm thế nào điều này có thể được thực hiện trong SQLite? Nếu ai biết, tôi chắc chắn có thể sử dụng nó.
hoff2

@ hoff2 Trên thực tế, đây có lẽ là cách đơn giản nhất để làm điều này. Trong trường hợp của tôi, tôi thậm chí không cần phải nơi có phần: stackoverflow.com/a/3845931/847201
ACK_stoverflow

6

Bạn cũng có thể sử dụng REPLACE, sau đó bạn có thể sử dụng lựa chọn với các phép nối. Như thế này:

REPLACE INTO clusure 
 SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change
FROM (
 SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
 WHERE ancestor_id = 1) sel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.