トップページに戻る
前のSQLパズルへ
12-7 第5正規形を分解前に戻す
SQLパズル
NF5_Part1 NF5_Part2 NF5_Part3
チーム名 会場 チーム名 ダンス 会場 ダンス
-------- ------ -------- -------- ------ --------
チームA 東京 チームA ポンポン 東京 ポンポン
チームA 名古屋 チームA ライン 東京 ジャズ
チームA 大阪 チームA ジャズ 名古屋 ライン
チームB 東京 チームB ポンポン 大阪 ジャズ
チームB ジャズ
以下の結合従属性を分解した第5正規形を、
自然結合で分解前に戻し、情報無損失分解であることを確認する。
出力結果
チーム名 会場 ダンス
-------- ------ --------
チームA 東京 ポンポン
チームA 東京 ジャズ
チームA 名古屋 ライン
チームA 大阪 ジャズ
チームB 東京 ポンポン
チームB 東京 ジャズ
データ作成スクリプト
create table NF5_Part1(
チーム名 NVarChar2(4),
会場 NVarChar2(3),
primary key (チーム名,会場));
create table NF5_Part2(
チーム名 NVarChar2(4),
ダンス NVarChar2(7),
primary key (チーム名,ダンス));
create table NF5_Part3(
会場 NVarChar2(3),
ダンス NVarChar2(7),
primary key (会場,ダンス));
insert all
into NF5_Part1 values('チームA','東京')
into NF5_Part1 values('チームA','名古屋')
into NF5_Part1 values('チームA','大阪')
into NF5_Part1 values('チームB','東京')
into NF5_Part2 values('チームA','ポンポン')
into NF5_Part2 values('チームA','ライン')
into NF5_Part2 values('チームA','ジャズ')
into NF5_Part2 values('チームB','ポンポン')
into NF5_Part2 values('チームB','ジャズ')
into NF5_Part3 values('東京','ポンポン')
into NF5_Part3 values('東京','ジャズ')
into NF5_Part3 values('名古屋','ライン')
into NF5_Part3 values('大阪','ジャズ')
select 1 from dual;
commit;
SQL
--■■■Natural Joinを使わない方法■■■
select a.チーム名,a.会場,b.ダンス
from NF5_Part1 a Join NF5_Part2 b
on a.チーム名 = b.チーム名
Join NF5_Part3 c
on a.会場 = c.会場
and b.ダンス = c.ダンス
order by a.チーム名,
decode(a.会場,'東京',1,'名古屋',2,'大阪',3),
Length(b.ダンス) desc;
--■■■Natural Joinを使う方法■■■
with tmp as(
select チーム名,会場,ダンス
from NF5_Part1 Natural Join NF5_Part2)
select チーム名,会場,ダンス
from tmp Natural Join NF5_Part3
order by チーム名,
decode(会場,'東京',1,'名古屋',2,'大阪',3),
Length(ダンス) desc;
解説
下記のNatural Joinでは、余計な組み合わせまで出力してしまいました。
(括弧でくくっても無駄でした)
select チーム名,会場,ダンス
from NF5_Part1 Natural Join NF5_Part2
Natural Join NF5_Part2;
select チーム名,会場,ダンス
from (NF5_Part1 Natural Join NF5_Part2)
Natural Join NF5_Part2;
出力結果
チーム名 会場 ダンス
-------- ------ --------
チームA 東京 ポンポン
チームA 東京 ジャズ
チームA 東京 ライン
チームA 名古屋 ポンポン
チームA 名古屋 ジャズ
チームA 名古屋 ライン
チームA 大阪 ポンポン
チームA 大阪 ライン
チームA 大阪 ジャズ
チームB 東京 ポンポン
チームB 東京 ジャズ