クエリ 1レコードの複数項目を複数レコードに分ける [クエリ]
テーブルに同じような内容の項目が複数必要な場合、冗長性を排除する正規化の考え方では別レコードに分かれるように設計するのですが、そうすると処理や管理が煩雑になる場合もあります。
例えば、1日につき3つの金額を記録したい場合に、このようなテーブルを作ったとします。
データベースで処理を行う際、同じ項目を複数レコードに渡って処理するのは簡単な場合が多いです。
逆に、1レコード中の、別々の項目に、同じ処理を行う場合は、面倒になることが多いです。
その場合、クエリを使って、各項目が独立したレコードになるように加工してから処理を行った方が効率が良い場合もあります。
今回はその方法を説明します。
テーブルには金額1、金額2、金額3の3つの項目があります。
最初に、金額1のみを返すクエリを考えます。
日付項目、金額1項目を設定します。
金額1項目は、項目名が「金額」になるように、別名を設定します。これは、後の金額2や金額3と同じ項目名にするためです。
また、金額の値がNullの場合は、レコードが返されても意味がないので、条件に「Is Not Null」を付けています。
元が金額1だった事が分かるように、「1」が固定で表示される「番号」項目を設定しています。
このクエリの結果は以下の通り。
同様に、金額2、金額3についても同様のクエリを作成します。(が、これらのクエリは直接は使用しません。)
最後に、それらの結果をつなぎ合わせれば、金額項目がレコードにばらされた状態の結果を得ることができます。
複数クエリの結果をつなぎ合わせるには、UNIONを使用します。
UNIONを使用する場合、クエリのデザインビューは使用できません。
「SQL」画面に切り替えるか、リボンの「ユニオン」をクリックして、SQL画面に切り替えます。
金額1のクエリの後に、「UNION ALL」を記述して、その後に金額2のクエリを記述します。
さらに「UNION ALL」を記述し、続けて金額3のクエリを記述します。
最後にORDER BYを記述して完了です。
結果は以下のとおり。
日別で金額番号別のレコードにばらせました。
UNIONの記述についてですが、今回は「UNION」だけではなく「UNION ALL」で記述しています。
「UNION」のみの場合は、同じ内容のレコードが複数件あった場合、1件のみ結果が返されます。
今回の例では関係ないのですが、「UNION ALL」で、すべてのレコードが返されるようにしています。
「UNION」で複数のレコードが1件になってしまっても、問題ない場合もあるとは思いますが、UNIONで集約をかけてしまうと、後々その処理の仕様がわからなくなる可能性があるので、私は常に「UNION ALL」を使用するようにしています。
集約する必要がある場合は、GROUP BYで明確に行うようにしています。
複数レコードが1件に集約されるとまずいのに、UNIONで結合を行ってしまっているコードをよく見かけるので…。
コメント 0