データ シェイプの概要
"データ シェイプ" とは、クエリ内の 2 つ以上の論理エンティティ間に階層関係を構築することです。 階層は、1 つの Recordset のレコードと、別の Recordset の 1 つ以上のレコード (チャプターとも呼ばれます) の間の親子関係で見ることができます。 親子関係では、親の Recordset に子の Recordset が含まれます。 このような階層関係の例としては、顧客と注文があります。 データベース内のすべての顧客に対し、0 個以上の注文が存在できます。 階層関係は再帰的にできます。つまり、子レコードに孫レコードを入れ子にすることができます。 原則として、階層レコードは任意の深さまで入れ子にできます。 実際には、ADO によって再帰は最大 512 Recordset に制限されます。
一般に、シェイプされた Recordset の列には、SQL Server などのデータ プロバイダーからのデータ、別の Recordset への参照、Recordset の 1 行の計算から導出された値、または Recordset 全体の列に対する操作から導出された値を保存できます。 列は、新しく作成された空のものでもかまいません。
別の Recordset への参照を含む列の値を取得すると、ADO は参照によって表される実際の Recordset を自動的に返します。 Recordset への参照は、実際には、"チャプター" と呼ばれる子のサブセットへの参照です。 1 つの親で複数の子 Recordset を参照できます。
ADO によるデータ シェイプのサポートにより、データ ソースのクエリを実行して、(親) レコードが (子) Recordset を表している Recordset を取得できます。 顧客注文のシナリオでは、データ シェイプを使って、顧客の情報と各顧客が行った注文を、1 回のクエリで取得できます。 結果の Recordset は、シェイプされた Recordset とも呼ばれます。
さらに、ADO のデータ シェイプでは、NEW キーワードを使って親と子の Recordset のフィールドを記述することで、基になるデータ ソースなしで新しい Recordset オブジェクトを作成できます。 その後、新しい Recordset オブジェクトにデータを設定して、永続的に格納できます。 開発者は、子のフィールドに対してさまざまな計算や集計 (SUM、AVG、MAX など) を実行することもできます。 データ シェイプでは、子のレコードをグループ化し、子の各グループに対する親に 1 行を配置することで、子の Recordset から親の Recordset を作成することもできます。
通常の SQL では、JOIN 構文を使ってデータを取得できますが、特定の親子関係に対して返される各レコードで冗長な親データが繰り返されるため、非効率的で扱いにくい場合があります。 データ シェイプを使うと、親 Recordset 内の単一の親レコードを子 Recordset 内の複数の子レコードに関連付けることができるので、JOIN の冗長性を回避できます。 ほとんどの場合、親子の複数の Recordset プログラミング モデルは、単一の Recordset JOIN モデルより自然で簡単に使用できます。