以下のような従属関係を表すテーブルにおいて、従属する配下の従属関係のあるレコードも選択、削除することは可能でしょうか。
上司='上田一郎'を指定した場合、行1,2,3,6を一括選択、削除したいのです。実際には複数のキーで実装する予定です。よろしくお願いします。
行 上司 部下
1 上田一郎 東田二郎
2 上田一郎 西田四郎
3 東田二郎 山田三郎
4 佐藤幸一 鈴木康二
5 佐藤幸一 井上幸三
6 山田三郎 北田四郎
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
利用されているRDBがわからないので一般的な答えですが、以下のページを参考に。
投稿2016/10/15 10:17
総合スコア12011
0
ベストアンサー
ひとつのDBのmysqlで簡単なストアドを作成してみました
mysql
1#tabel定義 2create table tableA (id int, joshi text, buka text); 3 4#ストアド 5DELIMITER // 6CREATE PROCEDURE sample03 ( IN in_name TEXT ) 7BEGIN 8 9DECLARE _done int; 10DECLARE _joshi_name TEXT; 11DECLARE _buka_name TEXT; 12DECLARE cur CURSOR FOR 13 SELECT joshi, buka FROM tableA WHERE joshi=in_name; 14DECLARE EXIT HANDLER FOR NOT FOUND SET _done = 0; 15 16SET _done = 1; 17OPEN cur; 18WHILE _done DO 19 FETCH cur INTO _joshi_name, _buka_name; 20 CALL sample03 (_buka_name); 21 DELETE FROM tableA WHERE joshi=_joshi_name AND buka=_buka_name; 22END WHILE; 23CLOSE cur; 24 25END 26// 27DELIMITER ; 28 29 30#実行 31set max_sp_recursion_depth=12; 32CALL sample03 ('上田一郎');
postgresでも作成してみました。指定された上司のレコードから、上司部下の関係のテーブルを最深階層(部下がいない)までを読み、そこから逆に上に戻りながら削除を行う動きとなります。
postgres
1#ストアド 2CREATE OR REPLACE FUNCTION test_sp_func9(in_name TEXT) 3RETURNS INT AS $$ 4 5DECLARE rc tableA%rowtype; 6DECLARE _ret int; 7BEGIN 8 9 FOR rc IN SELECT * FROM tableA WHERE joshi=in_name LOOP 10 SELECT test_sp_func9 (rc.buka) INTO _ret; 11 DELETE FROM tableA WHERE joshi=rc.joshi AND buka=rc.buka; 12 END LOOP; 13 RETURN 0; 14 15END; 16$$ LANGUAGE plpgsql; 17 18#実行 19select test_sp_func9('上田一郎');
SqlServerも作成しました。久々で自信はありませんが、動く様です。
WITH EMP_CTE(id, jyoshi, buka) AS ( SELECT id, jyoshi, buka FROM testAA WHERE jyoshi = '上田一郎' UNION ALL SELECT testAA.id, testAA.jyoshi, testAA.buka FROM testAA INNER JOIN EMP_CTE ON testAA.jyoshi = EMP_CTE.buka ) -- DELETE FROM testAA WHERE id in (SELECT id FROM EMP_CTE);
投稿2016/10/16 04:26
編集2016/10/19 04:38総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/17 17:37
2016/10/18 11:43
2016/10/19 06:41 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/17 01:26