2017-11-01 4 views
0

標準のORACLE SQLの例の表EMPの場合、スキーマには現行従業員のダイレクト・マネージャのEMPNOがプライマリ・キーであり、MGRはEMPNOです(外部キーは表自体を参照します)。1つの表で従属行を再帰的に削除します。oracle sql

質問1:1つのマネージャーを削除するために再帰的なSQLプロシージャーを作成し、このマネージャーの下で働いているすべての人物を黙って削除する方法 、それらに直接報告しない人を含む?

質問2:繰り返しベーステーブルによって作成されたビューからの削除によってこれを行うことができますか?

+0

IMO質問1を解決する "正しい"方法は、従属者の削除を処理するON DELETEトリガーを定義することです。 YMMV。 –

+0

あなたは 'MGR'に外部キーを持っています。したがって、そのマネージャの下にあるすべての従業員を再帰的に削除する場合、その従業員のいずれかが管理者である場合はどうなりますか。子レコードが見つかりましたが、失敗しませんでした制約エラー? –

答えて

0

これは、単一の削除ステートメントで行うことができます。

HIERARCHICALクエリを使用して階層内のすべての従業員を選択して削除する必要があります。

などに基づいて、VIEWを使用して、標準のOracle SQLの例テーブルEMP

DELETE FROM EMP WHERE EMPNO IN 
(SELECT EMPNO 
FROM EMP 
CONNECT BY PRIOR EMPNO = MGR 
START WITH EMPNO=7566); 

すべてのベスト:)

0

はい、それは可能でEMPNO 7566(JONES)の下にあるすべての従業員を削除するにはテーブルにを削除してください。が表示されます。

は、Employee表に基づいてビューを作成します

CREATE VIEW EMPLOYEE_VIEW AS SELECT * FROM EMPLOYEES; 

ビュー

CREATE OR REPLACE TRIGGER EMPLOYEE_VIEW_DEL INSTEAD OF DELETE ON 
EMPLOYEE_VIEW 
FOR EACH ROW 
BEGIN 
    DELETE FROM EMPLOYEES WHERE MANAGER_ID =:OLD.EMPLOYEE_ID; 

END; 
/

これは動作するはずでトリガを次のよう作成し、これはテーブルのエラーを変異さ変更表エラーORA-04091を避けることができます!

平和!

関連する問題