次の方法で共有


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 対多の関係です。
参照する (多くの) テーブルから見た場合の多対一の関係

リレーションシップ情報の取得

XrmToolBoxFetchXML Builder を使用すると、このツールでリレーションシップを選択して適切な namefromto 属性値を設定できることがわかります。

また、他のツールやAPIを使用してリレーションシップ データを検索し、使用する適切な namefromto 属性値を調べることもできます。 このデータを取得する方法を確認する。

一対多関連付け

多対 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 にはこれらの列があります: 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 つあります。

  • 最初のものは、systemuserteammembership が交差するテーブル systemuserid = systemuserid をつないでいます。
  • 2つ目は、teammembershipteamid = 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 属性で使用できますが、パフォーマンスが低下する可能性があります:

  • 複数行テキスト タイプの列
  • 最大長 850 を超える 1 行テキストタイプ の列
  • 数式
  • 計算
  • 論理

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

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

条件要素として entityname 属性を使用して、FetchXML の左外部結合を実行できます。 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 の詳細情報

existsininner の変形で、where 節で異なる条件 (それぞれ EXISTSIN) を使用し、親行の複数のコピーを結果に返さないようにしたものです。 これらのタイプはどちらも、リンク エンティティ行の列値を返しません。

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 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 分かかります。 個人データは収集されません (プライバシー ステートメント)。