ホーム > データベーススペシャリスト試験 > 2016年
データベーススペシャリスト試験 2016年 午前2 問10
更新可能なビューの定義はどれか。ここで, ビュー定義の中で参照する基底表は全て更新可能とする。
ア:
CREATE VIEW ビュー1(取引先番号, 製品番号)
AS SELECT DISTINCT 納入.取引先番号, 納入.製品番号
FROM 納入
イ:
CREATE VIEW ビュー2(取引先番号, 製品番号)
AS SELECT 納入.取引先番号, 納入.製品番号
FROM 納入
GROUP BY 納入.取引先番号, 納入.製品番号
ウ:
CREATE VIEW ビュー3(取引先番号, ランク, 住所)
AS SELECT 取引先.取引先番号, 取引先.ランク, 取引先.住所
FROM 取引先
WHERE 取引先.ランク > 15
(正解)エ:
CREATE VIEW ビュー4(取引先住所, ランク, 製品倉庫)
AS SELECT 取引先.住所, 取引先.ランク, 製品.倉庫
FROM 取引先, 製品
HAVING 取引先.ランク > 15
解説
# 更新可能なビューの定義についての解説
## 問題の背景
ビューとは、テーブル(基底表)に対して定義される仮想的な表のことです。ビューは通常のSELECT文で定義され、参照はできますが、その更新(INSERT・UPDATE・DELETE)が可能かどうかはビューの定義次第です。
**「更新可能なビュー」とは、ビューを通じて基底表のデータの変更(挿入・更新・削除)が可能なビューを指します。**
---
## 更新可能なビューの条件(一例)
ビューが更新可能になるためには、一般的に以下のような条件が必要です。
1. **単一の基底表からの参照**
ビューは1つのテーブルからのみデータを返すこと。
2. **集約関数やDISTINCTの不使用**
SUMやCOUNTなどの集約関数やDISTINCT句を含むビューは、更新可能性が制限される。
3. **GROUP BYを含まない**
GROUP BYを含むビューは集約のため、更新はできない。
4. **結合や結合条件が単純であること(結合がないことが望ましい)**
複数テーブルの結合をビューに含む場合、更新可能かどうかは非常に限定的。
5. **WHERE句の条件が十分に単純なこと**
複数行を1行にまとめるような条件や複雑なものは避ける。
---
## 選択肢の分析
### ア: ビュー1
```sql
CREATE VIEW ビュー1(取引先番号, 製品番号)
AS SELECT DISTINCT 納入.取引先番号, 納入.製品番号
FROM 納入
- DISTINCT句を使用しているため、重複行を除外している。
- DISTINCT句を含むビューは一般に更新可能でない。
→ 更新不可
イ: ビュー2
CREATE VIEW ビュー2(取引先番号, 製品番号)
AS SELECT 納入.取引先番号, 納入.製品番号
FROM 納入
GROUP BY 納入.取引先番号, 納入.製品番号
- GROUP BYを含んでいるため、グルーピングによって複数の行が1行にまとめられている可能性あり。
- 集約を伴うビューは更新不可。
→ 更新不可
ウ: ビュー3
CREATE VIEW ビュー3(取引先番号, ランク, 住所)
AS SELECT 取引先.取引先番号, 取引先.ランク, 取引先.住所
FROM 取引先
WHERE 取引先.ランク > 15
- 単一テーブル「取引先」からの参照
- WHERE句は更新不可能性に必ずしも影響しない
- DISTINCT、GROUP BY、集約関数なし
- 結合なし
このビューは更新可能と判断できる。
エ: ビュー4
CREATE VIEW ビュー4(取引先住所, ランク, 製品倉庫)
AS SELECT 取引先.住所, 取引先.ランク, 製品.倉庫
FROM 取引先, 製品
HAVING 取引先.ランク > 15
- 複数テーブル(取引先と製品)を結合している(クロス結合)
- HAVING句はグループ化を伴うための句だが、このSQLではGROUP BYがない(文法的に不適切の可能性もある)
- 複数テーブルの結合を含み、更新可能であることは非常に限定的
→ 更新不可
結論
- 更新可能なビューの要件を満たしているのは「ウ」のビュー3のみ
単一テーブル参照、WHERE条件あり、集約やDISTINCTなし、結合なし。
補足情報
更新可能ビューの判定はDBMSにより多少異なりますが、一般的なルールは上記の通りです。
まとめ
以上より、正解は ウ です。