Kimliklerin başka bir tablodan eşleşmediği sql satırlarını silme


161

Bir mysql tablosundaki yetim girdilerini silmeye çalışıyorum.

Bunun gibi 2 tablo var:

Tablo files:

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

tablo blob:

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidveid sütunlar tablolar birlikte katılmak için kullanılabilir.

Ben tablodaki tüm satırları silmek istediğiniz tabloda bulunamıyorblobfileidfiles.id .

Yani yukarıdaki örneği kullanarak blobtablodaki satırları siler: 3 & 4 (s) .


1
S kullanıyorsanız ikinci cevaba atlayın null.
Pacerier

Yanıtlar:


328

LEFT JOIN / IS NULL kullanılıyor:

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

KULLANILAMIYOR:

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

NOT IN kullanımı:

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

Uyarı

Mümkün olduğunda, bir işlem içinde DELETE gerçekleştirin (desteklenen - IE: MyISAM'da değil), böylece sorun olması durumunda değişiklikleri geri almak için geri alma özelliğini kullanabilirsiniz.


12
hangisi genel olarak yukarıdakilerin en hızlısıdır?
Hampus Brynolf

2
Nedense, LEFT JOIN kullanarak silmek MS SQL Server Mgmt Studio üzerinde işe yaramadı (neden emin değilim; sadece LEFT JOIN şikayet etti). Bunun neden olduğunu bilen var mı? DEĞİL DEĞİL kullanılarak çalıştı :)
Anna

5
Bilginize, işte bu üç yöntemin göreceli etkinliği hakkında faydalı bir tartışma: explainextended.com/2009/09/18/…
moustachio

2
@Pacerier - "yanlış" biraz güçlü. İnsanların anladığından emin olmak için, null değeri yoksa yanıtlar işe yarar . Ayrıca, üçüncü çözüm ( ) yalnızca null edilemeyen tarafından gerektirir . Muhtemelen bu birincil bir anahtardır, öyle olur. fileidNOT INf.id
Araç ÜreticisiSteve

2
SQLite ile bunu deneyen insanlar için: bu cevaba
bunkerdive

26
DELETE FROM blob 
WHERE fileid NOT IN 
       (SELECT id 
        FROM files 
        WHERE id is NOT NULL/*This line is unlikely to be needed 
                               but using NOT IN...*/
      )

Nedir "/ * Bu satır ihtiyaç duyulacak olası değildir ama DEĞİL İÇİNDE ... * / kullanarak" demek?
Pacerier

1
@Pacerier - NOT IN (NULL)boş bir sonuç kümesi döndürür, böylece NULL'ların hariç tutulması gerekir. Ancak bir idsütun büyük olasılıkla yine de boş bırakılamaz, bu nedenle "gerekmesi olası değildir"
Martin Smith

Vay canına iyi yakala. Omgponies'in yanıtı yanlış! not in(null)oldukça mantıklı, neden çalışmıyor? Bunun arkasındaki mantık nedir?
Pacerier


1
@bunkerdive Ardından, veritabanı adını içeren üç bölümlü nesne adları kullanın.
Martin Smith

18
DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)

1
Bence bir files.idve var blob.fileid. Sorgunuzun bir hataya neden olacağını tahmin ediyorum.
jww

-9
delete from table1 t1 
    WHERE not exists (select id from table2 where related_field_in_t2=t1.id) 
    AND not exists (select id from table3 where related_field_in_t3=t1.id) 
    AND not exists (select id from table4 where related_field_t4=t1.id) 
    AND not exists (select id from table5 where related_field_t5=t1.id);

3
Aşağı düştüm çünkü: 1. Bu, gönderilen bağlamda soruyu cevaplamaya çalışmaz. 2. Bir açıklama yoktur (ve yalnızca kod yanıtları Stackoverflow'da düşük değerlidir). 3. NOT EXISTS9 yıl önce gönderildi. 4. MySQL anahtar kelimeleri için tam olarak büyük harf kullanma konusunda en iyi uygulamayı tanıtmadınız. Başka bir deyişle, burada tutmaya değer bir şey yok - bu yüzden bu yazıyı silmek için oy verdim.
mickmackusa
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.