次の方法で共有


FetchXML を使用してテーブルを結合する

「FetchXml を使用したデータのクエリ」で説明されているように、エンティティ要素を使用してテーブルを選択してクエリを開始します。

link-entity 要素を使用して、クエリで返す関連テーブルのデータを記述します。 次の属性を使用します。

特性 簡単な説明 リンク エンティティ要素のリファレンスで詳細を見つける
name 関連するテーブルの論理名です。
from 属性で指定to一致する関連テーブルの列の論理名。
to 親要素内の列の論理名は、属性で指定された関連テーブル列と一致する必要があります。
link-type 使用するリンクの種類。 既定値は inner であり、両方のテーブルの値が一致する行に結果が制限されます。
その他の有効な値は次のとおりです。
- outer
- any
- not any
- all
- not all
- exists
- in
- matchfirstrowusingcrossapply
リンクの種類のオプションについて説明します
alias 結果の関連テーブルの名前を表します。
intersect link-entityを使用してテーブルを結合し、列を返さないことを示します。

基本的な例

次のクエリでは、取引先企業レコードの PrimaryContactId 参照列に基づいて、取引先企業テーブルと連絡先テーブルから最大 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 要素を追加できます。 各 link-entity では、クエリに JOIN が追加され、クエリの実行にかかる時間が長くなります。 この制限により、パフォーマンスが保護されます。 クエリに 15 個を超える link-entity 要素を追加すると、次のエラー メッセージが表示されます。

コード: 0x8004430D
数: -2147204339
メッセージ: Number of link entities in query exceeded maximum limit.

子要素

link-entity要素内では、親要素と同様に子要素を次のように追加できます。

多対一リレーションシップ

基本的な例は、多くの取引先企業レコードが 1 つの連絡先レコードを参照できる多対一リレーションシップを示しています。 この情報は、次の値を持つ アカウントの多対一のリレーションシップ account_primary_contact で定義します。

プロパティ 価値 コメント
SchemaName account_primary_contact リレーションシップの一意の名前。
ReferencedEntity contact 参照先のテーブル。 多対一の関係における
ReferencedAttribute contactid 参照先テーブルの主キー。
ReferencingEntity account 他のテーブルを参照する参照列を持つテーブル。 多対一の多くです。
ReferencingAttribute primarycontactid 参照列の名前。
RelationshipType OneToManyRelationship 参照先 (1) テーブルから表示される一対多リレーションシップ。
参照する (多くの) テーブルから見た場合の多対一の関係。

リレーションシップ情報を取得する

XrmToolBoxFetchXML BuilderPower Platform ToolBoxFetchXML Studio などのツールを使用する場合、これらのツールを使用してリレーションシップを選択して、適切なnamefrom、およびto属性値を設定する方法を確認できます。

他のツールや API を使用して、適切な namefrom、および to 属性値のリレーションシップ データを検索することもできます。 このデータを取得する方法については、以下を参照してください。

一対多関連付け

多対一と一対多の関係は、同じコインの両側のようなものです。 リレーションシップはテーブル間に存在するため、使用する方法は、クエリのベース テーブルであるテーブルによって異なります。

前の例と同じデータは、同じリレーションシップを使用して、連絡先テーブルの側から取得できます。 同じ Contact account_primary_contact一対多リレーションシップのデータを使用しますが、リレーションシップのさまざまなビューの値を調整します。

<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>

次の表に、この例の リンク エンティティ 属性値を示します。

特性 価値 Description
name account 参照元テーブルの論理名
from primarycontactid 参照するアカウント テーブルのルックアップ列名
to contactid 参照先の連絡先テーブルの主キー
alias account 一対多の関係であるlink-entityには、値を指定することをお勧めします。 エイリアスを指定しない場合、システムによって既定のエイリアスが生成されます。 この例では、エイリアスを指定しない場合、データは account1.name という名前の列で返されます。
link-type 設定なし 値を設定しない場合、既定値は 〗 inner

結果には、多対一リレーションシップを使用する前のクエリと同じレコードとデータが含まれます。 違いは、親エンティティcontactではなくaccountされていることです。

 -----------------------------------------------------------------
 | 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 には、 systemuseridteamidの列があります。

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 つのリンク エンティティがあります。

  • 最初のテーブルは、systemuserteammembershipsystemuserid = systemuserid交差テーブルに接続します。
  • 2つ目は、teammembershipteamid = teamidteam と交差するテーブルをつないでいます。

結果は次のようになります。

 --------------------------------------
 | 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を使用することはできません。

これらの列の種類は、 from 属性と to 属性で使用できますが、パフォーマンスが低下する可能性があります。

セット内にないレコードを検索する

FetchXML を使用すると、 左外部結合を使用して、セット内にないレコードを返すクエリを作成できます。 左外部結合では、2 番め入力で最初の入力の結合を満たす各列を返します。 また、2 番目入力で一致する列がない最初の入力列を返します。 2 番目の入力の一致しない行は null 値として返されます。

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 と in の詳細を確認する
in パフォーマンス上の利点を提供できる inner のバリエーション。 句で where 条件を使用します。 これは、結果に親行の複数のコピーが必要ない場合に使用します。 exists と in の詳細を確認する
matchfirstrowusingcrossapply パフォーマンス上の利点を提供できる inner のバリエーション。 この型は、リンクされたエンティティの一致する行の 1 つの例だけで十分であり、結果内の親行の複数のコピーが必要ない場合に使用します。 matchfirstrowusingcrossapply の詳細を確認する

existsおよびinリンクタイプは、innerリンクタイプのバリアントです。 クエリで親行の複数のコピーが返されないように、句で異なる条件 (EXISTSwhere) を使用します。 これらのリンク型はいずれも、リンク エンティティ行の列値を返しません。

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 結合でリンクされたエンティティ内のすべての一致する行を見つけるよりも効率的です。

このリンク型では、次のパターンに従って、サブクエリを持つ CROSS APPLY 演算子 top 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 つの例だけで十分で、結果に親行の複数のコピーが必要ない場合に使用します。

matchfirstrowusingcrossapply リンク型を使用する場合、Web API または SDK Entity.Attributes コレクションを使用して返されるプロパティの名前Keys関連するテーブル列の値は、他の種類の結合とは異なります。 通常、これらの名前は <tablealias>.<logicalname> 形式に従います。 ただし、 matchfirstrowusingcrossapply リンク型の 場合、SchemaName 値はテーブルエイリアスプレフィックスなしで使用されます。

前のクエリ例を他のリンクの種類と共に使用すると、プロパティまたはキーに次の名前を付けることができます。

  • fullname
  • contactid
  • account1.accountid
  • account1.name

ただし、 matchfirstrowusingcrossapply リンクの種類を使用すると、プロパティまたはキーには次の名前が付きます。

  • fullname
  • contactid
  • AccountId
  • Name

次のステップ

行を並べ替える方法について説明します。