条件付きSQL結合
SQLの結合は、2つ以上の結果セットを1つに結合します。それが、結合の本来的な機能です。しかし、結合はまた、別の結果セットを選ぶ方法、すなわち実行時にSELECTステートメントを有効化または無効化する方法も提供します。私はこの機能を数多くの場面で利用してきました。ここでは、結合のそのような使い方について説明します。
まず、結合の性質について考えてみます。結合のそれぞれの結果セットは、WHEREおよびHAVING節の基準に応じて、データを返すことも、データを返さないこともあります。SELECTがデータを取得しない場合、システムは結合の結果に空のセットを追加します。SELECTをオンまたはオフにするための方法は、WHEREおよびHAVING節の選択基準をコントロールすることです。
いつものように例を使用します。シンプルなクエリーから始めましょう。ミネソタ州およびニューヨーク州在住の顧客をリストアップしてみましょう。これは、非常にシンプルなクエリーになるでしょう。
一方の州または両方の州に顧客がいる場合、結果セットを受け取ります。
State | City | CusNum | LstNam |
---|---|---|---|
MN | アイル | 846283 | アリソン |
MN | アイル | 583990 | エイブラハム |
NY | クレイ | 839283 | ジョーンズ |
NY | ヘクター | 397267 | タイロン |
NY | ヘクター | 192837 | リー |
それら2つの州在住の顧客がいない場合、どの行(レコード)もWHERE節に一致しないため、空のセットを受け取ります。
空であるかデータが入っているかにかかわらず、結果セットがGUIフォームでグリッドをロードするとします。結果セットにデータが入っている場合、ユーザーは顧客のリストを受け取ります。結果セットが空の場合は、ユーザーに対する思いやりの意味で、ユーザーにメッセージを表示します。コンピューターが要求を処理しようとしてくれているのかどうか、ユーザーが不安に思わないようにするためです。
違いを見てみてください。SELECTを、Selectedという共通表式に移動しました。
私は、アカウント番号の数値を文字へ変換することにしました。これは必ずしも必要なことではありませんが、結合を多少スムーズにします。 ここでは共通表式を照会します。
FROM節は2つのSELECTステートメントを結合します。1つ目のSELECTステートメントは、Selectedのデータを読み取るため、結果セットを返す場合と、返さない場合があります。2つ目のSELECTステートメントは、共通表式が空の場合に、1つの行の結果セットを返します。
このステートメントは、少し奇妙に見えるかもしれません。このステートメントのHAVING節には、GROUP BYがありません。そのようなケースでは、入力セット全体(ここでは共通表式Selected)は1つのグループとみなされ、SELECT節にはリテラルおよび集約関数のみ指定できます。GROUP BYがないことが気になるようなら、以下を追加することができます。
結果セットが空だった場合、グリッドは次のように表示されます。
State | City | CusNum | LstNam |
---|---|---|---|
No data |
結果としては、2つのSELECTステートメントのうちの1つ(1つのステートメントだけ)がデータを返します。