ここはとある街の総合病院。
ここには通常の診療科のほかに,
何軒もの病院をたらいまわしにされた,
それがSQL緊急救命室,
そう,
- ロバート
- 救命室部長。腕の立つエンジニアだが,
口が悪く性格はもっと悪い四十オヤジ。 - ヘレン
- 救命室副部長。若いながらもロバートに次ぐ実力を持つ才媛。救命室の良心。
- ワイリー
- インターンで救命室に配属された不運な学生。無給で治療から雑務全般にこき使われる。エンジニアとしては新人に毛が生えたレベル。
(AM9:00 病院の入り口。ワイリーが扉の前をウロウロしている)
(ロバートが出勤し,
なんだ,
あっ先生……! 違いますよ。専門課程の合格通知,
倒れたらすぐに献体として使ってやる。それがお前の医学にできる最大の貢献だ。
ふう……まったく。いい加減そのぐらいにして,
更新における冗長なサブクエリ
(治療室。ヘレンがいる。)
遅いじゃないの。先にはじめてたわよ。
すまんな。こいつが道草を食っていたせいでな。……まったく。上の空だな。早く気持ちを切り替えろ。
すいません。どうも不安で。
ああ,
はい。
カルテ1:受発注システムで利用するテーブル
代入式への行式の拡張
患者のコード
リスト1 患者のコード
UPDATE OrderDetails
SET item = (SELECT item
FROM EntryDetails AS ED
WHERE OrderDetails.entry_id = ED.entry_id
AND OrderDetails.entry_seq = ED.entry_seq),
quantity = (SELECT quantity
FROM EntryDetails AS ED
WHERE OrderDetails.entry_id = ED.entry_id
AND OrderDetails.entry_seq = ED.entry_seq);
間違いじゃないわ。結果は正しく更新されるわ。
ふむ。とすると問題は……。
これまでの治療で見てきた症状を挙げていってみなさい。
ええっと,
このサブクエリは明らかに冗長だな。まあ,
でもどうやって直すんですか?
前回勉強したでしょう。行式よ
リスト2 ヘレンの解:行式を利用
UPDATE OrderDetails
SET (item, quantity)
= (SELECT item, quantity
FROM EntryDetails ED
WHERE OrderDetails.entry_id = ED.entry_id
AND OrderDetails.entry_seq = ED.entry_seq);
へえ! UPDATE文のSET句でも行式は使えるのですね。
逆に聞くけど,
いやそれは……。そんないじめないでくださいよ,
気色悪い……。