メニューボタン
IBMi海外記事2017.06.22

UNIONとORDER BYに関するSQLの事実、第二弾

Ted Holt 著

こんにちは、Ted:

先週の記事に、結合のORDER BY節で式は使用できないとの記述がありました。結合をサブクエリーとして使うとORDER BYで式を使用できます。レイヤが追加されますが、お探しの結果が得られると思います。

-S. Sims

Simsさんのおっしゃる通りです。結合のORDER BYで式を使用できないことに重点を置き過ぎていたせいか、回避策のことはすっかり忘れてしまっていました。彼(彼女?)の手法は、おそらくこの制約に対処するためのもっとも一般的な方法です。Web上でも、すべての種類のデータベース管理システム向けの、この手法の多数の例を見てきました。記事に追記することを思い付けばよかったと思います。

洞察力の鋭い読者であるSimsさんが、私のコードを修正したものは、以下の通りです。

技術情報code01

結合を副選択の中に入れることは、ORDER BY節はその結合ではなく、外側のSELECTに適用するということです。そのため、式を使用できるようになります。

CUSTNBR NAME CITY STATE ZIP
10004 ザミャーチン食堂 スー フォールズ MN 57105
10002 ザミャーチン食堂 スー フォールズ MN 57105
10003 ゴーゴリ葬儀社 サンノゼ CA 95111-3830
10006 プーシキン ピザ ロサンゼルス CA 90034-1920
10005 カーウッド ベーカリー サンノゼ CA 95111
10002 チェホフ自動車 シカゴ IL 60632-2015
10004 カミュ ペット ショップ ロックフォード IL 61109-2292
10001 トルストイ ドーナツ ショップ ニューオーリンズ LA 70116
10005 ドストエフスキー銀行 ボルティモア MD 21224
10001 フローベール織物 ラレド TX 78045
10003 ジッド自動車修理工場 ミルウォーキー WI 53207

この手法には、次のようなもうひとつの利点があります。それは、ORDER BYが、結合の中にない列を参照できる点です。以下に、その例を示します。

技術情報code02

このクエリーでは、詳細およびサマリー行の両方をリストします。 サマリー行を最後に表示したいので、詳細はブランク値、サマリーはTで、record-type列を作成します。仮に、その結合でORDER BYをコーディングするとしたら、RecType列でソートするためにはRecType列を含めることが必要になるでしょう。結合を副選択の中に入れることで、そうした要件がなくなります。結果セットは、次のようになります。

CUSTNBR YEARLY
10004 700.00
10003 300.00
10005 250.00
10002 150.00
10006 125.00
10001 100.00
Total 1,625.00

『IT Jungle』Webサイトにコメントをご投稿いただき、S. Simsさんには大変感謝しております。 S. Simsさんは、私の書き忘れを穴埋めしてくれただけではありませんでした。おかげで、現在作業中のプロジェクトでもこの手法が必要だったことを、思い出すことができました。

あわせて読みたい記事

PAGE TOP