5 Temmuz 2011 Salı

İlişkili Tablolarda Veri Silme (Delete Join)

Şu ana kadar Joinleme işlemlerini ve Update Join işlemini görmüştük. Normal Joinleme işlemlerinde, birbiri ile ilişkili iki tablodan veri çekip, rahatlıkla istenilen raporu dökebiliyorduk. Daha sonra da, yine ilişkili tablolarda, gerekli şartları sağlayan kayıtları toplu halde update(Güncelleme) yapabiliyorduk. Bugün de, yine ilişkili tablolarda, belli şartları sağlayan verileri sileceğiz.

Örnek senaryomuz, AdventureWorks üzerinden AltKategorileri 'G' ile başlayan ürünleri silmek istensin bizden. Gördüğünüz gibi, tek tablo işimizi görmüyor. Product tablosundan kayıt sileceğiz ama, bu tablo üzerinden AltKategori isimlerine erişemiyoruz. İşte burada yapmamız gereken şey, iki tabloyu birleştirip, silme işlemini gerçekleştirmek. Bunun için yazmamız gereken kod şu şekilde olmalıdır;


DELETE FROM Production.Product
FROM Production.Product p INNER JOIN Production.ProductSubcategory ps on p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.Name like 'G%'




Gördüğünüz gibi, önce hiçbir şart yokmuş gibi DELETE FROM Production.Product diyorum, daha sonra da belirtilen şartı sağlamak için joinleme işlemi yapıyorum. Bunun sonucunda, 6 kayıdın Product tablosundan silindiğini görürüz.

Not: Delete sorgusunu kullanarak, birden fazla tabloda veri silmek mümkün değildir. Bunun için birden fazla delete sorgusu çalıştırılmalıdır.

3 yorum:

Unknown dedi ki...

sondaki NOT'unuz çok yarar sağladı bana, teşekkürler.

Disco dedi ki...

Merhabalar. Sondaki notunuzu okudum.

DELETE c, d,g, i, o, p, pr, t
FROM comments c, discounts d, products p, productid pr, images i, gifts g, onecikan o, tags t
WHERE i.productID='359'
AND p.id='359'
AND c.productID='359'
AND d.productID='359'
AND g.productID='359'
AND o.productID='359'
AND pr.productID='359'
AND t.productID='359'

gibi bir kodum var. Örneğin comments tablosunda 359 productID'ye ait veri yok.. Bu sorguyu döndürdüğümüzde 0 sonuç alıyor..

Bunu öteki tablolardan bağımsız olarak diğer tablolarda silme işlemini yapamıyor muyuz?

Sonda verdiğiniz notun cevabı hayır..
Ancak bu kod ise diğer tabloların hepsinde 359 id'si varsa tüm tablolardan silme işlemini gerçekleştiriyor. Bu nedenle bu sorunun cevabını merak ediyorum.

Adsız dedi ki...

Faydalı yazı teşekkürler. Disco, sorunun cevabı delete cascade.