ホーム > データベーススペシャリスト試験 > 2011年

データベーススペシャリスト試験 2011年 午前208


“取引先”表, “商品”表, “注文”表の3表を基底表とするビュー“注文 123”を操作する SQL文のうち, 実行できるものはどれか。ここで, 各表の列のうち下線のあるものを主キーとする。
問題画像
DELETE FROM 注文 123 WHERE 取引先 ID = '111'
INSERT INTO 注文 123 VALUES (8, '目白商店', 'レンチ', 3)
SELECT 取引先.名称 FROM 注文123
UPDATE 注文123 SET 数量 = 3 WHERE 取引先名='目白商店'(正解)

解説

ビュー 「注文 123」 をもう一度確認

CREATE VIEW 注文123 AS
SELECT  注文番号,
        取引先.名称  AS 取引先名,
        数量
FROM    注文, 取引先, 商品
WHERE   注文.商品番号 = '123'          -- ① 商品は常に 123
  AND   注文.取引先ID = 取引先.取引先ID -- ② 注文→取引先を結合
  AND   注文.商品番号 = 商品.商品番号;  -- ③ 注文→商品を結合
ビュー列元表可否
注文番号注文更新可
取引先名取引先更新不可(別表の列)
数量注文更新可
  • 主キー(注文番号)で一意に “1 注文行” に対応 しているため、
    注文表 の列だけを更新する操作は SQL-92 の規定上「可能な更新可能ビュー」です。
  • ただし 挿入・削除 となると、複数表をまたぐため標準では不可。
    (INSTEAD OF トリガを用意する等の前提は試験問題では考えない)
  • ビューに含まれない列名を参照すると文法エラー。

各選択肢を検証

選択肢評価
DELETE … WHERE 取引先ID = '111'ビューに 取引先ID 列は無い → 列名エラー
INSERT INTO … VALUES (…)ビューは複数表由来 → 標準SQLでは INSERT 不可。さらに列数も 4 ≠ 3
SELECT 取引先名称 FROM 注文123ビュー列名は 取引先名。名称の漢字が違い → 列名エラー
UPDATE 注文123 SET 数量 = 3 WHERE 取引先名 = '目白商店'更新対象は 数量(注文表の列)だけで一意に行が決まる → 実行可能

なぜ だけが実行できるのか

  1. WHERE 取引先名 = '目白商店' でビュー行は一意(注文番号=4)。
  2. 更新する列 数量 は “注文” 表にのみ存在。
  3. 取引先名(別表列)は検索条件に使うだけで、変えない。
  4. SQL 標準 15.1 c)
    「ビューが多表結合を含んでいても、一意決定できる1つの基表の列のみを更新する場合は updatable である」

結論

UPDATE 文だけがエラーなく実行できる。
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ