概要
SQLパズル p113 26 DFDその1の学習メモです。
解くうえで以下2つがポイントです。
・cross結合で順序対を作ることと
・exceptを使った差集合演算
要件
DFDで存在しないフローを取得したい
DFDで図示した場合、赤線部分を取得したい
SQL
DDL
drop table if EXISTS DataFlowDiagrams;
CREATE TABLE DataFlowDiagrams
(diagram_name CHAR(10) NOT NULL,
bubble_name CHAR(10) NOT NULL,
flow_name CHAR(10) NOT NULL,
PRIMARY KEY (diagram_name, bubble_name, flow_name));
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'input' , 'guesses');
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'input' , 'opinions');
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'crunch', 'facts');
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'crunch', 'guesses');
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'crunch', 'opinions' );
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'output', 'facts');
INSERT INTO DataFlowDiagrams VALUES('Proc1', 'output', 'guesses');
INSERT INTO DataFlowDiagrams VALUES('Proc2', 'reckon', 'guesses');
INSERT INTO DataFlowDiagrams VALUES('Proc2', 'reckon', 'opinions' );
答えのSQL
-- 26 DFD その1
SELECT *
FROM ( -- bubble_nameとflow_nameの組み合わせを全部算出する。
SELECT F1.diagram_name, F1.bubble_name,F2.flow_name
FROM DataFlowDiagrams AS F1
CROSS JOIN DataFlowDiagrams AS F2) AS TMP
EXCEPT -- 存在するテーブルを弾く。
SELECT F3.diagram_name,F3.bubble_name,F3.flow_name
FROM DataFlowDiagrams AS F3
;
-- FROM以下のSQLを確認する
--クロス結合で直積を求める。(9*9=81の組み合わせ)
SELECT F1.diagram_name, F1.bubble_name,F2.flow_name
FROM DataFlowDiagrams AS F1
CROSS JOIN DataFlowDiagrams AS F2;
-- 既にあるフローを表示する
SELECT F3.diagram_name,F3.bubble_name,F3.flow_name
FROM DataFlowDiagrams AS F3
;
参考
SQLパズル p113 26 DFD
SQLパズル サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p26
達人に学ぶSQL徹底指南書第2版 p44 重複順列、順列 組み合わせ クロス結合を使って順序対を作成
dfdの例
https://cacoo.com/ja/blog/what-is-dfd/#i
postgresql except
https://www.postgresql.jp/docs/15/queries-union.html
github 差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/1d2c0e852024ee85957b3825f6140cc25808da8b