適用先: Access 2013、Office 2013
大きな子 Recordset を処理するとき、特に親 Recordset のサイズと比べて大きいにもかかわらず、わずかな子チャプターにアクセスするだけの場合は、パラメーター化コマンドを使用する方が効率的です。
パラメーター化されていないコマンドは、親レコードセットと子レコードセット全体の両方を取得し、親にチャプター列を追加してから、親行ごとに関連する子チャプターへの参照を割り当てます。
パラメーター化されたコマンドは親 Recordset 全体を取得しますが、チャプター列にアクセスするとチャプター Recordset のみを取得します。 This difference in retrieval strategy can yield significant performance benefits.
たとえば、次のように指定することができます。
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
親テーブルと子テーブルには、共通の列名 (cust_id*.* ) があります。 この子コマンド には、RELATE 句が参照する "?" プレースホルダーがあります (つまり、"...パラメーター 0")。
注:
[!メモ] PARAMETER 句は、Shape コマンドの構文にのみ影響します。 ADO の Parameter オブジェクトまたは Parameters コレクションとは関係ありません。
パラメーター化された Shape コマンドが実行されると、次のようになります。
parent-command が実行され、Customers テーブルから親 Recordset が返されます。
チャプター列が親 Recordset に追加されます。
親行のチャプター列にアクセスすると、パラメーターの値として customer.cust_id の値を使用して、child-command が実行されます。
手順 3 で作成したデータ プロバイダー行セット内のすべての行を使用して、子 Recordset を設定します。 この例では、Cust_idが customer.cust_id の値と等しい Orders テーブル内のすべての行です。 既定では、親 Recordsetへのすべての参照が解放されるまで、子 Recordset s がクライアントにキャッシュされます。 この動作を変更するには、 Recordset動的プロパティの [子行のキャッシュ] を False に設定 します。
取得された子の行への参照 (つまり、子 Recordset のチャプター) は、親 Recordset のカレント行のチャプター列に配置されます。
別の行のチャプター列にアクセスすると、手順 3. ~ 5. が繰り返されます。
既定では、 Cache Child Rows 動的プロパティは True に設定されています。 キャッシュの動作は、クエリのパラメーター値によって異なります。 単一のパラメーターが指定されたクエリの場合、指定されたパラメーター値に対応する子 Recordset は、その値を持つ子に対する要求があるまでキャッシュに保持されます。 次のコードにこの例を示します。
...
SCmd = "SHAPE {select * from customer} " & _
"APPEND({select * from orders where cust_id = ?} " & _
"RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext ' Next cust_id passed to Param 0, & new rs fetched
' into RstChild.
Rst1.MovePrevious ' RstChild now holds cached rs, saving round trip.
...
2 つ以上のパラメーターが指定されたクエリでは、すべてのパラメーター値がキャッシュに入れられた値と等しい場合のみ、キャッシュに入れられた子が使用されます。
パラメーター化されたコマンドと複雑な親の子関係
パラメーター化されたコマンドを使用すると、等結合タイプの階層のパフォーマンスを向上できるだけでなく、より複雑な親子関係をサポートできます。 たとえば、チーム (team_id、team_name) と試合 (date、home_team、visiting_team) の 2 つのテーブルで構成されるリトルリーグのデータベースがあるとします。
非パラメーター化階層を使用する場合、各チームの子 Recordset にその完全な日程が含まれるように、チーム テーブルと試合テーブルを関連付けることはできません。 ホームの日程または遠征の日程のいずれかを含むチャプターを作成することはできますが、両方を含むチャプターは作成できません。 これは、RELATE 句では、親子関係が (pc1=cc1) AND (pc2=pc2) 形式に制限されるためです。 そのため、コマンドに "RELATE team_id TO home_team, team_id TO visiting_team" と指定すると、そのチーム単独で行う試合だけが返されます。 ここで必要なのは、"(team_id=home_team) OR (team_id=visiting_team)" ですが、Shape プロバイダーでは OR 句をサポートしていません。
必要な結果を取得するには、パラメーター化されたコマンドを使用します。 次に例を示します。
SHAPE {SELECT * FROM teams}
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}
RELATE team_id TO PARAMETER 0,
team_id TO PARAMETER 1)
この例では、必要な結果を取得するため、より柔軟に SQL WHERE 句を利用しています。