SQLアタマアカデミー
第2回 更新なんてこわくない! (4)同じテーブル内の別の行から値を計算する
同じテーブル内の別の行から値を計算する
最後に,
表8 サンプルテーブル
Stocks:株価テーブル
brand | sale_ | price |
---|---|---|
A鉄鋼 | 2008-07-01 | 1000 |
A鉄鋼 | 2008-07-04 | 1200 |
A鉄鋼 | 2008-08-12 | 800 |
B商社 | 2008-06-04 | 3000 |
B商社 | 2008-09-11 | 3000 |
C電気 | 2008-07-01 | 9000 |
D産業 | 2008-06-04 | 5000 |
D産業 | 2008-06-05 | 5000 |
D産業 | 2008-06-06 | 4800 |
D産業 | 2008-12-01 | 5100 |
Stocks2:更新先の株価テーブル
brand | sale_ | price | trend |
---|---|---|---|
|
trendは前回の終値と今回の終値を比較して,
表9 Stocks2:更新後
brand | sale_ | price | trend |
---|---|---|---|
A鉄鋼 | 2008-07-01 | 1000 | |
A鉄鋼 | 2008-07-04 | 1200 | ↑ |
A鉄鋼 | 2008-08-12 | 800 | ↓ |
B商社 | 2008-06-04 | 3000 | |
B商社 | 2008-09-11 | 3000 | → |
C電気 | 2008-07-01 | 9000 | |
D産業 | 2008-06-04 | 5000 | |
D産業 | 2008-06-05 | 5000 | → |
D産業 | 2008-06-06 | 4800 | ↓ |
D産業 | 2008-12-01 | 5100 | ↑ |
今度は既存の行に対する更新ではなく,
リスト9 trend列を計算してINSERTする更新SQL
INSERT INTO Stocks2
SELECT brand, sale_date, price,
CASE SIGN(price -
(SELECT price
FROM Stocks S1
WHERE brand = Stocks.brand
AND sale_date =
(SELECT MAX(sale_date)
FROM Stocks S2
WHERE brand = Stocks.brand
AND sale_date < Stocks.sale_date)))
WHEN -1 THEN '↓'
WHEN 0 THEN '→'
WHEN 1 THEN '↑'
END
FROM Stocks;
SIGN関数は引数の値の正・
INSERTを使用するメリット,デメリット
同じ要領で,
反対に,
おわりに
私たちが日常SQLでデータベースを扱う際に発生する問題の半分は,
しかし,
- 注5)
- Eric Steven Raymond氏。オープンソース運動の指導者の1人で,
スポークスマン的な役割を引き受けている。引用は氏の著書 『伽藍とバザール』 より。Web上でも読むことができる。
参考資料
- J.セルコ
『SQLパズル 第2版』 (翔泳社, 2007, ISBN:978-4-7981-1413-2) UPDATE文での相関サブクエリの応用については,
「パズル4 入館証」, 「パズル18 ダイレクトメール」, 「パズル38 記録の更新」 が格好の演習になるでしょう。また, 「SELECT文をあれこれひねるよりも, テーブル設計を見直せ」 という言葉の重要性を体感できる実例としては, 「パズル8 プリンタの割り当て」, 「パズル17 人材紹介会社」, 「パズル24 10個のうち1つだけ」, 「パズル39 保険損失」 など。 - ミック
『達人に学ぶ SQL徹底指南書』 (翔泳社, 2008, ISBN:978-4-7981-1516-0) 更新SQLと組み合わせることで大きな効力を発揮するCASE式と相関サブクエリの基本については,
「1-1. CASE式のススメ」, 「1-6. 相関サブクエリで行と行を比較する」 を参照。また, 相関サブクエリにおける自己参照のイメージをつかみたければ, 「1-2. 自己結合の使い方」 をどうぞ。 - J.セルコ
『プログラマのためのSQL 第2版』 (ピアソン・ エデュケーション, 2001,
ISBN:978-4-8947-1480-9) リスト機能については
「10. 2 SQL-92における行の比較」 を参照。リスト比較は, より一般的には行全体を操作単位とする行比較としてとらえられます。
バックナンバー
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)クロス結合