SQLite'de tabloları birleştirirken nasıl GÜNCELLEME yapabilirim?


92

Denedim :

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

Ve:

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

Her ikisi de MySQL ile çalışıyor, ancak bunlar bana SQLite'da bir sözdizimi hatası veriyor.

Bu GÜNCELLEME / BİRLEŞTİRME'nin SQLite 3.5.9 sürümüyle çalışmasını nasıl sağlayabilirim?


Yanıtlar:


129

Yapamazsın. SQLite , UPDATE deyimlerindeki JOIN'leri desteklemez .

Ancak bunu muhtemelen bunun yerine bir alt sorgu ile yapabilirsiniz:

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

Ya da böyle bir şey; şemanızın tam olarak ne olduğu belli değil.


20
Bunun zorlaştığı nokta, bir ilişkinin yönünü tersine çevirmek için yapmanız gereken şey, bir sütunu bir tablodan diğerine kopyalamaktır. MySQL'de foos.bar_id sütununu oluşturup sonra bars.foo_id sütununu update foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idbırakın gibi bir şey yapabilirsiniz ... bu SQLite'da nasıl yapılabilir? Eğer bilen varsa, kesinlikle kullanabilirim.
hoff2

@ hoff2 Aslında, bunu yapmanın muhtemelen en basit yolu budur. Benim durumumda WHERE EXISTS bölümüne bile ihtiyacım yoktu: stackoverflow.com/a/3845931/847201
ACK_stoverflow

7

DEĞİŞTİR'i de kullanabilirsiniz, ardından seçimi birleştirmelerle kullanabilirsiniz. Bunun gibi:

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
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.