2008-09-12 18 views
0

DepartmentID列を持つCompaniesというテーブルがあるとします。 EmployeeID列を持つDepartamentsテーブルもあります。もちろん私はEmployeeテーブルも持っています。問題は私が会社を削除したいので、最初にすべての従業員をすべての部門のために削除してから、会社のすべての部門を削除する必要があるということです。 カスケード削除はオプションではないため、ネストされたトランザクションを使用したいと考えています。私はSQLに新しいので、あなたの助けに感謝します。カスケード削除を実行するネストされたSQL Serverトランザクション

答えて

4

を使用しているプラ​​ットフォームに依存したいですここに。あなたが唯一の実際のトランザクションを必要とする:FROMダブル

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 

注意を、それはそれはDELETEに参加を実行するための正しいSQL構文だ、タイプミスではありません。

各文はアトミックです。DELETE全体が成功するか失敗するかはバッチ全体が成功するか失敗するため、この場合重要ではありません。

私はあなたがあなたの関係を後方に持っていたと思います。 DepartmentはEmployeeIDを持たず、EmployeeはDepartmentIDを持ちます。

+0

クエリを最適化して、会社のINNER JOINを削除することができます。それとも、これはSQL Serverが自動的に行うものでしょうか? – rpetrich

+0

あなたはそうです。私はそれらを明示的に追加しましたが、WHERE句を次のように変更することができます: WHERE Department.CompanyID = @CompanyID – Brannon

0

私はあなたの質問に答えるつもりはありませんが、外国のキーです、なぜそれはオプションではないですか?彼らはネストされたトランザクションについては

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

は、プログラム、それは当然の異なる見えますが、それはあなたがネストされたトランザクションを必要とする理由あなたは、私はよく分からない

関連する問題