2011-02-11 14 views
22

Satır kimlikleri başka bir tabloda bulunmayan bir SQLite tablosundaki satırları silmem gerekir. SELECT ifadesi doğru satır döndürür:Başka bir tabloda hiçbir eşleşme olmadığında satırları SQLite tablosundan silme

SELECT * FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL; 

Ancak silme deyimi SQLite bir hata oluşturur:

DELETE FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL; 

hatadır: SQLite Hatası 1 - yakın "sol": sözdizimi hatası. Kullanabileceğim başka bir sözdizimi var mı?

+0

açıklamak için: Ben siliyorum

DELETE FROM cache WHERE id IN (SELECT cache.id FROM cache LEFT JOIN main ON cache.id=main.id WHERE main.id IS NULL); 

(Test edilmedi)

cevap

40

SQLite, Syntax diagrams'da gördüğünüz gibi, ekleme deyimiyle birleştirme işlemini desteklemiyor. Ancak bunları silmek için bir alt sorgu kullanabilmeniz gerekir.

ie.

DELETE FROM cache WHERE id NOT IN (SELECT id from main); 
+0

Teşekkürler! Cevabınızı okumadan önce buna çok yaklaştım, IN yerine eşit kullanıyordum, bu yüzden denemem gayet iyi çalışıyordu. –

12

Eğer alt sorgunun yolundan giderken yana, hem tamamen katılmak ve basitleştirmek sorgunun kurtulmak olabilir

"ana" tablonun satırlarından ek olarak, herhangi bir satırın kullanıcı tarafından "kilitli" olarak işaretlenmesi (yani, kilitlenene kadar silinmemesi) için satırlar: Ana WHERE id DELETE = =? AND kilitli = 0; Her başarılı silme, "önbellek" tablosundan eşleşen bir satırı silerek izlenmesi gerekir, ancak SQlite, ilk silme deyiminin gerçekten herhangi bir satırla eşleşip eşleşmediğini bildiren bir değer döndürmez. Bunun yerine önbellek tablosundan "eşsiz" satırları silmeye çalıştım ve sol birleşim üzerinde takıldım.
+5

"Ana" milyonlarca satır içeriyorsa ideal bir çözüm değil. İlk önce katılımı en iyisi. – Jacob

+1

@Jacob Umarım bir kişi ilk etapta milyonlarca satır sqlite yapmaz. – fluffy

+0

Tablolarınızda birincil anahtarlar yoksa, anında bir tane kesebilirsiniz, örneğin: 'Önbelleğinden DELETE xHER || ',' || y DEĞİL (SELECT x || ',' || y ana); ' – bonh