2008-09-12 14 views
0

Bir Departman Kimliği sütununa sahip Şirketler adlı bir tablo var. EmployeeID sütunu olan bir Departaments tablosu da var. Tabii ki bir de çalışan tablom var. Sorun şu ki, bir şirketi silmek istiyorum, bu yüzden önce tüm çalışanları ve şirketteki tüm departamentleri silmek zorundayım. Cascade Sil bir seçenek değildir, bu nedenle iç içe geçmiş işlemleri kullanmak istiyorum. SQL konusunda yeniyim, bu yüzden yardımın için minnettarım.İç içe SQL Server işlemi kaskad silme gerçekleştiriliyor

cevap

4

kullandığınız platforma bağlı ediyorum İşte. o bir DELETE içinde JOIN gerçekleştirmek için doğru SQL sözdizimi var, bir yazım hatası değil,

BEGIN TRAN 

DELETE FROM Employee 
    FROM Employee 
    INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID 
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID 
    WHERE Company.CompanyID = @CompanyID 

DELETE FROM Department 
    FROM Department 
    INNER JOIN Company ON Department.CompanyID = Company.CompanyID 
    WHERE Company.CompanyID = @CompanyID 

DELETE FROM Company 
    WHERE Company.CompanyID = @CompanyID 

COMMIT TRAN 

Not GELEN çift: Yalnızca bir asıl işlemi gerekir.

Her ifade atomiktir, ya DELETE'nin tamami basar ya da basarisiz olur; bu, bu durumda önemli degildir, çünkü tüm grup ya basar ya da basarisiz olur.

BTW-Sanırım ilişkilerinizi geri aldınız. Departmanın bir Çalışan Kimliği bulunmayacak, Çalışan bir Departman Kimliği alacaktı.

+0

Şirketinizdeki INNER JOIN'leri kaldırmak için sorgularınız en iyi duruma getirilebilir. Yoksa bu SQL Server'ın otomatik olarak yapacağı bir şey mi olurdu? – rpetrich

+0

Haklısınız. Ben sadece açık olması için onları ekledim, ancak WHERE yan tümcesini değiştirmek için: WHERE Department.CompanyID = @CompanyID – Brannon

0

Sorunuzu yanıtlamıyorum, ancak yabancı tuşlar yoludur, neden bir seçenek değil? İç içe işlemler gelince

onlar:

BEGIN 
    delete from Employee where departmentId = 1; 
    BEGIN 
    delete from Department where companyId = 2; 
    BEGIN 
     delete from Company where companyId = 2; 
    END 
    END 
END 

Programlı elbette farklı görünüyor, ama bu iç içe geçmiş işlem neden ihtiyaç emin değilim sen