トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

12-6 第4正規形を分解前に戻す

SQLパズル

NF4_Part1                NF4_Part2
チーム名  メンバー名      チーム名    道具名
--------  ----------     ---------  --------------
チームA   鈴木            チームA    ユニフォームA
チームA   斉藤            チームA    ポンポン
チームA   小林            チームB    ユニフォームA
チームB   鈴木            チームB    バトン
チームB   山川

以下の多値従属性を分解した第4正規形を、
自然結合で分解前に戻し、情報無損失分解であることを確認する。
多値従属性
第4正規化 出力結果 チーム名 メンバー名 道具名 -------- ---------- ------------ チームA 鈴木 ユニフォームA チームA 鈴木 ポンポン チームA 斉藤 ユニフォームA チームA 斉藤 ポンポン チームA 小林 ユニフォームA チームA 小林 ポンポン チームB 鈴木 ユニフォームB チームB 鈴木 バトン チームB 山川 ユニフォームB チームB 山川 バトン

こちらを参考にさせていただきました


データ作成スクリプト

create table NF4_Part1(
チーム名   NVarChar2(4),
メンバー名 NVarChar2(2),
primary key (チーム名,メンバー名));

create table NF4_Part2(
チーム名   NVarChar2(4),
道具名     NVarChar2(9),
primary key (チーム名,道具名));

insert all
into NF4_Part1 values('チームA','鈴木')
into NF4_Part1 values('チームA','斉藤')
into NF4_Part1 values('チームA','小林')
into NF4_Part1 values('チームB','鈴木')
into NF4_Part1 values('チームB','山川')
into NF4_Part2 values('チームA','ユニフォームA')
into NF4_Part2 values('チームA','ポンポン')
into NF4_Part2 values('チームB','ユニフォームB')
into NF4_Part2 values('チームB','バトン')
select 1 from dual;
commit;


SQL

--■■■Natural Joinを使わない方法■■■
select a.チーム名,a.メンバー名,b.道具名
  from NF4_Part1 a Join NF4_Part2 b
    on a.チーム名 = b.チーム名
order by a.チーム名,
decode(a.メンバー名,'鈴木',1,'山川',2,'斉藤',3),
Length(b.道具名) desc;

--■■■Natural Joinを使う方法■■■
select チーム名,a.メンバー名,b.道具名
  from NF4_Part1 a Natural Join NF4_Part2 b
order by チーム名,
decode(a.メンバー名,'鈴木',1,'山川',2,'斉藤',3),
Length(b.道具名) desc;


解説

Natural Joinでも大丈夫ですね。