UNIONとORDER BYに関するSQLの事実、第二弾
こんにちは、Ted:
先週の記事に、結合のORDER BY節で式は使用できないとの記述がありました。結合をサブクエリーとして使うとORDER BYで式を使用できます。レイヤが追加されますが、お探しの結果が得られると思います。
-S. Sims
Simsさんのおっしゃる通りです。結合のORDER BYで式を使用できないことに重点を置き過ぎていたせいか、回避策のことはすっかり忘れてしまっていました。彼(彼女?)の手法は、おそらくこの制約に対処するためのもっとも一般的な方法です。Web上でも、すべての種類のデータベース管理システム向けの、この手法の多数の例を見てきました。記事に追記することを思い付けばよかったと思います。
洞察力の鋭い読者であるSimsさんが、私のコードを修正したものは、以下の通りです。
結合を副選択の中に入れることは、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が、結合の中にない列を参照できる点です。以下に、その例を示します。
このクエリーでは、詳細およびサマリー行の両方をリストします。 サマリー行を最後に表示したいので、詳細はブランク値、サマリーは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さんは、私の書き忘れを穴埋めしてくれただけではありませんでした。おかげで、現在作業中のプロジェクトでもこの手法が必要だったことを、思い出すことができました。