2009-04-21 40 views
86

tôi đã cố gắng:Làm cách nào để tạo một UPDATE khi tham gia các bảng trên SQLite?

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 làm việc với MySQL, nhưng những người cho tôi một lỗi cú pháp trong SQLite.

Tôi làm cách nào để cập nhật UPDATE/JOIN này với phiên bản SQLite 3.5.9?

+0

này đã được trả lời bằng cách http://stackoverflow.com/questions/3845718/sql-how-to-update-table-values-from-another-table-with-the-same -user-name –

Trả lời

122

Bạn không thể. SQLite doesn't support JOINs in UPDATE statements.

Tuy nhiên, bạn có lẽ có thể làm điều này với một subquery thay vì:

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

Hoặc một cái gì đó như thế; không rõ chính xác sơ đồ của bạn là gì.

+20

Trường hợp này được lông là khi những gì bạn cần làm là sao chép một cột từ một bảng khác để đảo ngược hướng của một hiệp hội. nơi trong MySQL bạn có thể làm một cái gì đó như thế, tạo cột foos.bar_id, sau đó 'cập nhật foos tham gia thanh trên bars.foo_id = foos.id đặt foos.bar_id = bars.id', sau đó thả cột bars.foo_id ... làm thế nào điều này có thể được thực hiện trong SQLite? Nếu có ai biết, tôi chắc chắn có thể sử dụng nó. – hoff2

+0

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

6

Bạn cũng có thể sử dụng REPLACE sau đó bạn có thể sử dụng lựa chọn có kết 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 
Các vấn đề liên quan