SQLアタマアカデミー
第9回 SQLでループ! 相関サブクエリの使い方~切れ過ぎるナイフにご用心~ (3)便利で危険な相関サブクエリ①
便利で危険な相関サブクエリ① 更新と組み合わせる
まずは,
部署別の最高齢社員の情報を記録するテーブルです。
図8 部署別の最高齢社員の情報を記録するテーブルを作成
EmpMaxAge
dept | name | age |
営業 | ||
総務 | ||
開発 |
まずはそのまま書いてみる
さて,
すでにレコードが存在するので,
リスト4 部署ごとの最高齢社員を更新する
しかしこのUPDATE文はエラーになります。理由は,
図9 エラーになっているテーブルのイメージ
EmpMaxAge
なぜエラーになるのか
リレーショナルデータベースの基本原則の1つに
図10 このようなテーブルは存在しえない
dept | name | age |
営業 | 石川 | 40 |
総務 | 藤田 | 50 |
開発 | 小川 長谷川 | 29 29 |
裏を返すと,
対処法
この幽霊に対処する方法は,
- ① 情報の登録方法をINSERTに変えてしまう
- ② 小川さんと長谷川さんのうち,
適当にどちらか1人だけを代表に選んで登録する
どちらを取るのがよいのかは,
ここでは,
なお,
リスト5 ① INSERTを使った洗い替え方式
まずは全行削除(TRUNCATEでも可)
DELETE FROM EmpMaxAge;
全行登録
INSERT INTO EmpMaxAge
SELECT dept, name, age
FROM Employees E1
WHERE age = (SELECT MAX(age)
FROM Employees E2
WHERE E1.dept = E2.dept);
COLUMN グローバル変数とローカル変数
筆者はあるとき,
見た瞬間,
しかし残念なことに,
これはなかなかに虚を突く,
実は,
したがって,
SQL には
バックナンバー
SQLアタマアカデミー
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (5)集合指向と手続き型
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (4)OLAP関数と集約関数を組み合わせる
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (3)OLAP専用関数
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (2)OLAP関数の基本構文
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (1)OLAP関数とは何か
- 第10回 結合大全 (5)非等値結合
- 第10回 結合大全 (4)自己結合
- 第10回 結合大全 (3)外部結合
- 第10回 結合大全 (2)内部結合
- 第10回 結合大全 (1)クロス結合