Anasayfa / Yazılım / SQL / DELETE ile Veri Silme İşlemleri

DELETE ile Veri Silme İşlemleri

Bu yazımda da DELETE deyimi ile veri silme işlemlerine devam etmek istiyorum. Üzerinde çalışacağımız veritabanı örneği AdventureWorks2012 veri tabanı. Eğer demo tablolarınız mevcut değilse aşağıdaki kodu ilgili veritabanı üzerinde oluşturulacak bir Query penceresinde çalıştırın ve demo tabloları oluşturun.

IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoProduct]')
AND type in (N'U'))
DROP TABLE [dbo].[demoProduct];
GO
SELECT * INTO dbo.demoProduct FROM Production.Product;
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoCustomer]')
AND type in (N'U'))
DROP TABLE [dbo].[demoCustomer];
GO
SELECT * INTO dbo.demoCustomer FROM Sales.Customer;
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoAddress]')
AND type in (N'U'))
DROP TABLE [dbo].[demoAddress];
GO
SELECT * INTO dbo.demoAddress FROM Person.Address;
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoSalesOrderHeader]')
AND type in (N'U'))
DROP TABLE [dbo].[demoSalesOrderHeader];
GO
SELECT * INTO dbo.demoSalesOrderHeader FROM Sales.SalesOrderHeader;
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[demoSalesOrderDetail]')
AND type in (N'U'))
DROP TABLE [dbo].[demoSalesOrderDetail];
GO
SELECT * INTO dbo.demoSalesOrderDetail FROM Sales.SalesOrderDetail;

Şimdi bir kaç örnekle uygulama gerçekleştirelim.

1- Öncelikle şunu yapalım, dbo.demoCustomer tablosunda LastName kolonunda yer alan verilerden A harfi ile başlayanlar kaç adet görelim.

SELECT LastName FROM dbo.demoCustomer WHERE LastName LIKE 'A%';

Geriye 911 değer dönüyor.

2013042904

Şimdi bu tablodaki bu verileri silelim. Bunun için sorgumuz şöyle olur;

DELETE FROM dbo.demoCustomer WHERE LastName LIKE 'A%';

Çalıştırdığımızda (911 row(s) affected) mesajını alırız ve satırları silmiş oluruz. Tekrar listeletmeyi deneyelim :

SELECT LastName FROM dbo.demoCustomer WHERE LastName LIKE 'A%';

2013042905

Geriye görüleceği üzere veri dönmüyor.

2- Bir başka örnek yapalım. Yine dbo.demoCustomer tablosu ile ilişkili olarak ve dbo.demoSalesOrderHeader tablosundaki sipariş bilgilerini de dikkate alarak hiç sipariş yapmayan ve sipariş değeri 1000$ altında olan müşterilerin bilgilerini silelim.

Bu işlemi iki yöntemle yapabiliriz. Öncelikle CTE kullanarak nasıl bir kod yazabiliriz. Görelim :

WITH Sales AS (SELECT C.CustomerID FROM dbo.demoCustomer AS C 
LEFT OUTER JOIN dbo.demoSalesOrderHeader AS SOH ON C.CustomerID = SOH.CustomerID
GROUP BY C.CustomerID HAVING SUM(ISNULL(TotalDue,0)) < 1000) 
DELETE C FROM dbo.demoCustomer AS C
INNER JOIN Sales ON C.CustomerID = Sales.CustomerID;

Bu sorguyu alt sorgu yaparak oluşturalım.

DELETE FROM dbo.demoCustomer WHERE CustomerID IN (SELECT C.CustomerID FROM
dbo.demoCustomer AS C LEFT OUTER JOIN dbo.demoSalesOrderHeader AS SOH 
ON C.CustomerID = SOH.CustomerID GROUP BY C.CustomerID 
HAVING SUM(ISNULL(TotalDue,0)) < 1000);

Alt sorgu olarak da bu şekilde oluşturarak ilgili silme işlemimi yapabilirdim.

3- Bu örnekte de dbo.demoProduct tablosundan hiç sipariş edilmeyenleri silelim.

DELETE Urun FROM dbo.demoProduct AS Urun LEFT OUTER JOIN dbo.demoSalesOrderDetail
AS SatisSiparisDetay ON Urun.ProductID = SatisSiparisDetay.ProductID
WHERE SatisSiparisDetay.ProductID IS NULL;

Sorgumuzu çalıştırınca (238 row(s) affected) mesajını alırız yani 238 satır veri silinmiştir. Bu sorguyu aşağıdaki gibi alt sorgu ile de yazabiliriz.

DELETE FROM dbo.demoProduct WHERE ProductID NOT IN (SELECT ProductID 
FROM dbo.demoSalesOrderDetail WHERE ProductID IS NOT NULL);

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir