FetchXML を使用しテーブルを結合する
FetchXml を使用したデータのクエリで説明したように、クエリを開始するには、エンティティ要素を使用してテーブルを選択します。
リンク エンティティ要素を使用して、クエリで返す関連テーブルのデータを以下の属性で記述します:
Attribute | 簡易説明 詳細はリンク エンティティ要素のリファレンスを参照してください |
---|---|
name |
関連するテーブルの論理名です。 |
from |
to 属性で指定された列と一致する関連テーブルの列に由来する論理名。 |
to |
from 属性で指定された関連テーブル列と一致させる、親要素内の列の論理名。 |
link-type |
リンクの使用タイプ。 既定の動作は inner で、両方のテーブルの値が一致する行に結果を制限します。その他の有効な値は以下のとおりです: - outer - any - not any - all - not all - exists - in - matchfirstrowusingcrossapply リンク タイプ オプションの詳細 |
alias |
結果の関連テーブル名を表します。 |
intersect |
link-entity がテーブルの結合に使用され、列を返さないことを示します。 |
たとえば、次のクエリは、account レコードの PrimaryContactId ルックアップ列に基づいて、accountテーブルとcontactテーブルから最大5レコードを返します:
<fetch top='5'>
<entity name='account'>
<attribute name='name' />
<link-entity name='contact'
from='contactid'
to='primarycontactid'
link-type='inner'
alias='contact'>
<attribute name='fullname' />
</link-entity>
</entity>
</fetch>
結果はこのようになります:
-----------------------------------------------------------------
| name | contact.fullname |
-----------------------------------------------------------------
| Litware, Inc. (sample) | Susanna Stubberod (sample) |
-----------------------------------------------------------------
| Adventure Works (sample) | Nancy Anderson (sample) |
-----------------------------------------------------------------
| Fabrikam, Inc. (sample) | Maria Campbell (sample) |
-----------------------------------------------------------------
| Blue Yonder Airlines (sample) | Sidney Higa (sample) |
-----------------------------------------------------------------
| City Power & Light (sample) | Scott Konersmann (sample) |
-----------------------------------------------------------------
制限
クエリには最大 15 の link-entity
要素を追加できます。 各リンク エンティティはクエリに JOIN を追加し、クエリの実行時間を増加させます。 この制限はパフォーマンスを保護するためのものです。 クエリに 15 個以上のリンク エンティティ要素を追加すると、このエラーが発生します。
コード:
0x8004430D
番号:-2147204339
メッセージ:Number of link entities in query exceeded maximum limit.
子要素
link-entity
要素内では、親要素と同様に子要素を次のように追加できます:
多対一関連付け
前の例は、多くの取引先レコードが 1 つの取引先責任者レコードを参照できる多対 1 の関係です。 この情報は、account_primary_contact という一対一のリレーションシップ で定義されます:
Property | 価値 | Comment |
---|---|---|
SchemaName |
account_primary_contact |
リレーションシップの固有名です。 |
ReferencedEntity |
contact |
参照されるテーブルです。 多対一のものです。 |
ReferencedAttribute |
contactid |
参照されるテーブルの主キーです。 |
ReferencingEntity |
account |
他のテーブルを参照するルックアップ列を持つテーブルです。 多対一の多くです。 |
ReferencingAttribute |
primarycontactid |
ルックアップ列の表示名です。 |
RelationshipType |
OneToManyRelationship |
参照 (1 つの) テーブルから見た場合の 1 対多の関係です。 参照する (多くの) テーブルから見た場合の多対一の関係 |
リレーションシップ情報の取得
XrmToolBox FetchXML Builder を使用すると、このツールを使用して関係を選択し、適切な name
、 from
、 to
属性値を設定できることがわかります。
また、他のツールやAPIを使用してリレーションシップ データを検索し、使用する適切な name
、from
、to
属性値を調べることもできます。 このデータを取得する方法を確認する。
一対多関連付け
多対 1 と 1 対多の リレーションシップ は、コインの表裏のようなものです。 リレーションシップはテーブル間に存在するため、その使用方法は、どのテーブルがクエリのベース テーブルであるかによって異なります。
連絡先テーブルの側からの場合を除き、同じリレーションシップを使用して、前の例と同じデータを連絡先テーブルから取得できます。 同じ Contact account_primary_contact の 1 対多リレーションシップのデータを使用しますが、リレーションシップの異なるビュー用に値を調整します。
<fetch top='5'>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='account'
from='primarycontactid'
to='contactid'
alias='account'>
<attribute name='name' />
</link-entity>
</entity>
</fetch>
次の表に、この例でのリンク エンティティの属性値を示します:
Attribute | 価値 | Description |
---|---|---|
name |
account |
参照 するテーブルの論理名 |
from |
primarycontactid |
参照するアカウント テーブルのルックアップ列名 |
to |
contactid |
参照する連絡先テーブルの主キー |
alias |
account |
一対多のリレーションシップを持つ link-entity には値を指定することをお勧めします。 エイリアスが指定されていない場合は、既定のエイリアスが生成されます。 この例では、エイリアスを指定しなかった場合、account1.name という名前の列が返されます。 |
link-type |
設定しない | 値が設定されていない場合、既定は inner です。 |
結果には、親エンティティ が account
ではなく contact
となっている点を除き、多対一のリレーションシップを使用した前のクエリと同じレコードとデータが含まれます。
-----------------------------------------------------------------
| fullname | account.name |
-----------------------------------------------------------------
| Susanna Stubberod (sample) | Litware, Inc. (sample) |
-----------------------------------------------------------------
| Nancy Anderson (sample) | Adventure Works (sample) |
-----------------------------------------------------------------
| Maria Campbell (sample) | Fabrikam, Inc. (sample) |
-----------------------------------------------------------------
| Sidney Higa (sample) | Blue Yonder Airlines (sample) |
-----------------------------------------------------------------
| Scott Konersmann (sample) | City Power & Light (sample) |
-----------------------------------------------------------------
多対多関連付け
多対多のリレーションシップは、交差テーブルに依存します。 通常、交差テーブルには 4 つの列しかありませんが、重要なのはそのうちの 2 つだけです。 2 つの重要な列は、参加しているテーブルの主キー列と一致します。
たとえば、TeamMembership
交差 テーブルは、SystemUser テーブルと Team テーブル間の teammembership_association 多対多のリレーションシップをサポートしています。 これにより、ユーザーが複数のチームに参加したり、チームに複数のユーザーが所属したりすることができます。 TeamMembership
にはこれらの列があります: systemuserid
、teamid
.
teammembership_association
の多対多のリレーションシップを使用して、ユーザーとそのユーザーが所属するチームに関する情報を取得したい場合は、この fetchXML クエリを使用できます:
<fetch top='2'>
<entity name='systemuser'>
<attribute name='fullname' />
<link-entity name='teammembership'
from='systemuserid'
to='systemuserid'
intersect='true' >
<link-entity name='team'
from='teamid'
to='teamid'
link-type='inner'
alias='team'>
<attribute name='name' />
</link-entity>
</link-entity>
</entity>
</fetch>
入れ子になったリンク エンティティが 2 つあります。
- 最初のものは、
systemuser
とteammembership
が交差するテーブルsystemuserid
=systemuserid
をつないでいます。 - 2つ目は、
teammembership
がteamid
=teamid
のチームと交差するテーブルをつないでいます。
結果は次のようになります:
--------------------------------------
| fullname | team.name |
--------------------------------------
| FirstName LastName | org26ed931d |
--------------------------------------
| # PpdfCDSClient | org26ed931d |
--------------------------------------
リレーションシップがない
定義されたリレーションシップの一部ではない列を使用して from
属性と to
属性を指定できます。
たとえば、このクエリは、アカウントレコードの Name 列が、連絡先 レコードの FullName 列 と一致するレコードのペアを、それらがルックアップ列のいずれかで互いに参照し合っているかどうかに関係なく見つけます。
<fetch>
<entity name='account'>
<attribute name='name' />
<link-entity name='contact'
from='fullname'
to='name'
link-type='inner'
alias='contact'>
<attribute name='fullname' />
</link-entity>
</entity>
</fetch>
注意
from
属性と to
属性で指定された列は、リレーションシップに関与していない場合でも同じ型であることが重要です。 異なる型の列を使用すると型変換が必要になり、パフォーマンスに影響を与える可能性があり、一部の列値では失敗する可能性があります。
次の 列タイプ は from
属性と to
属性では使用できません:
- ファイル
- Image
- MultiSelect フィールド
- PartyList
一部の列は from
属性と to
属性で使用できますが、パフォーマンスが低下する可能性があります:
セットにないレコードを検索する
FetchXml を使用して、左外部結合 を使用してセットに含まれていないレコードを返すクエリを作成できます。 左外部結合では、2 番め入力で最初の入力の結合を満たす各列を返します。 また、2 番目入力で一致する列がない最初の入力列を返します。 2 番目の一致しない列が null 値として返されます。
FetchXML 条件要素の entityname
属性 を使用して 左外部結合を実行できます。 entityname
属性は、条件、フィルターおよび入れ子フィルターで有効です。 リンク エンティティのフィルターの詳細。
たとえば、次のクエリは、取引先担当者のいないアカウント レコードをすべて返します。
<fetch>
<entity name='account'>
<attribute name='name' />
<order attribute='name' />
<link-entity name='contact'
from='parentcustomerid'
to='accountid'
link-type='outer'
alias='contact' />
<filter type='and'>
<condition entityname='contact'
attribute='parentcustomerid'
operator='null' />
</filter>
</entity>
</fetch>
高度なリンク タイプを使用する
次のリンク エンティティ タイプは、T-SQL JOIN 演算子 タイプに直接対応せず、代わりに サブクエリ を使用します。 これらのタイプは、クエリのパフォーマンスを向上させ、より複雑なクエリを定義するために使用できる、より高度な機能を提供します。
件名 | Description |
---|---|
exists |
inner のバリアントで、パフォーマンス上の利点があります。 where 句で EXISTS 条件を使用します。 親の行を複数コピーする必要がない場合に使用します。 exists と in に関する詳細情報 |
in |
inner のバリアントで、パフォーマンス上の利点があります。 where 句で IN 条件を使用します。 親の行を複数コピーする必要がない場合に使用します。 exists と in に関する詳細情報 |
matchfirstrowusingcrossapply |
inner のバリアントで、パフォーマンス上の利点があります。 このタイプは、リンクされたエンティティの一致する行の例が 1 つだけで十分で、結果に親行の複数のコピーが必要ない場合に使用します。 matchfirstrowusingcrossapply の詳細情報 |
exists
または in
リンク タイプの使用
exists
と in
は inner
の変形で、where
節で異なる条件 (それぞれ EXISTS と IN) を使用し、親行の複数のコピーを結果に返さないようにしたものです。 これらのタイプはどちらも、リンク エンティティ行の列値を返しません。
exists
これらの FetchXml と SQL の例は、exists
で適用されるパターンを示しています。
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='exists'>
<filter type='and'>
<condition attribute='statecode'
operator='eq'
value='1' />
</filter>
</link-entity>
</entity>
</fetch>
in
これらの FetchXml と SQL の例は、in
で適用されるパターンを示しています。
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='in'>
<filter type='and'>
<condition attribute='statecode'
operator='eq'
value='1' />
</filter>
</link-entity>
</entity>
</fetch>
exists
または in
リンク タイプを使用すると、特に、同じ親行に対して一致するリンク行が多数存在する場合や、同じ親に対して複数のリンク エンティティを使用する場合に、中間または最終的なクエリ結果のサイズを小さくすることができます。 exists
または in
リンク タイプを使用すると、各親行に対して異なるリンク エンティティからの行のすべての可能な並べ替えを含むデカルト積を返す必要がないため、inner
タイプに比べてクエリのパフォーマンスを向上させることができます。
これらのリンク タイプでは、Dataverse 各親行に対して最初に一致するリンク エンティティ行のみを検索することもできます。これは、inner
結合のリンク エンティティで一致するすべての行を検索するよりも効率的です。
リンク タイプ matchfirstrowusingcrossapply
を使用する
このリンク タイプは、このパターンに従った を使用するサブクエリを持つ CROSS APPLYtop 1
演算子を生成します:
<fetch>
<entity name='contact'>
<attribute name='fullname' />
<link-entity name='account'
from='primarycontactid'
to='contactid'
link-type='matchfirstrowusingcrossapply'>
<attribute name='accountid' />
<attribute name='name' />
</link-entity>
</entity>
</fetch>
matchfirstrowusingcrossapply
リンク型は、親行を最大 1 回しか返さない点を除けば、inner
型と同等です。 リンクされたエンティティ内に一致する行がある場合にのみ親行が返されますが、in
型や exists
型とは異なり、リンクされたエンティティ内の一致する行の 1 つから列値を返します。 これは、リンクされたエンティティの一致する行の例が 1 つだけで十分で、結果に親行の複数のコピーが必要ない場合に使用します。
関連するテーブルのプロパティ/属性名が一致しない
matchfirstrowusingcrossapply
リンク タイプを使用するときは、関連するテーブル列の Web API または SDK Entity.Attributes コレクション Keys
値を使用して返されるプロパティの名前、他のタイプの結合とは異なります。 通常、これらは <tablealias>.<logicalname>
形式に従います。 ただし、matchfirstrowusingcrossapply
リンクタイプ、スキーマ名 値はテーブル エイリアス プレフィックスなしで使用されます。
他のリンク タイプで前のクエリの例を使用すると、プロパティまたはキーが次の名前を持つことが期待できます。
fullname
contactid
account1.accountid
account1.name
しかし、matchfirstrowusingcrossapply
リンク タイプのプロパティまたはキーには次の名前があります。
fullname
contactid
AccountId
Name
次の手順
列の注文方法について解説します。
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。