Compartir a través de


Combinación de tablas mediante FetchXml

Como se describe en Consulta de datos mediante FetchXml, inicie la consulta seleccionando una tabla mediante el elemento entity.

Utilice el elemento link-entity para describir los datos de las tablas relacionadas para que estos se devuelvan con tu consulta con los siguientes atributos:

Atributo Descripción breve Buscar más detalles en la referencia del elemento link-entity
name El nombre lógico de la tabla relacionada.
from Nombre lógico de la columna de la tabla relacionada que coincide con la columna especificada en el to atributo .
to Nombre lógico de la columna del elemento primario que debe coincidir con la columna de tabla relacionada especificada en el from atributo .
link-type Tipo de uso de vínculo. El comportamiento predeterminado es inner, que restringe los resultados a las filas con valores coincidentes en ambas tablas.
Otros valores válidos son:
- outer
- any
- not any
- all
- not all
- exists
- in
- matchfirstrowusingcrossapply
Más información sobre las opciones de tipo de vínculo
alias Representa el nombre de la tabla relacionada en los resultados.
intersect Indica que link-entity se usa para combinar tablas y no devolver ninguna columna.

Por ejemplo, la consulta siguiente devuelve hasta 5 registros de la cuenta y las tablas de contacto basadas en la columna de búsqueda PrimaryContactId del registro de cuenta:

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

Los resultados tienen este aspecto:

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

Limitaciones

Puede agregar hasta 15 link-entity elementos a una consulta. Cada entidad de vínculo agrega una JOIN a la consulta y aumenta el tiempo para ejecutar la consulta. Este límite es proteger el rendimiento. Si agrega más de 15 elementos de entidad de vínculo a una consulta, obtendrá este error:

Código: 0x8004430D
Número: -2147204339
Mensaje: Number of link entities in query exceeded maximum limit.

Elementos secundarios

Dentro del elemento link-entity se pueden agregar elementos secundarios al igual que en el elemento padre.

Relaciones de muchos a uno

El ejemplo anterior es una relación de varios a uno, donde muchos registros de cuenta pueden hacer referencia a un registro de contacto único. Esta información se define en la relación de muchos a uno Relación de cuenta account_primary_contact, que tiene los siguientes valores:

Propiedad Importancia Comentario
SchemaName account_primary_contact Nombre único de la relación.
ReferencedEntity contact Tabla a la que se hace referencia. El one (uno) en many-to-one (muchos a uno).
ReferencedAttribute contactid Clave principal de la tabla a la que se hace referencia.
ReferencingEntity account La tabla con una columna de búsqueda que hace referencia a la otra tabla. El many (muchos) en many-to-one (muchos a uno).
ReferencingAttribute primarycontactid Nombre de la columna de búsqueda.
RelationshipType OneToManyRelationship Una relación de uno a muchos cuando se ve desde la tabla referenciada (uno).
Una relación de muchos a uno cuando se be desde la tabla de referencia (muchos)

Recuperar información de relación

Si usa XrmToolBoxFetchXML Builder, puede ver cómo esta herramienta le permite seleccionar la relación para establecer los valores de atributo , namey from adecuadosto.

También puede usar otras herramientas y APIs para buscar datos de relación para los valores de atributo adecuados de name, from, y to a utilizar. Obtenga información sobre cómo recuperar estos datos:

Relaciones de uno a varios

Las relaciones de muchos a uno y de uno a muchos son como ver las dos caras de una moneda. La relación existe entre las tablas, por lo que la forma en que se usa depende de la tabla base de la consulta.

Puede recuperar los mismos datos que en el ejemplo anterior de la tabla de contactos usando la misma relación, excepto desde el costado de la tabla de contactos. Utilice los datos de la misma relación de cuenta account_primary_contact one-to-many, pero ajuste los valores para la vista diferente de la relación.

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

En la tabla siguiente se muestran los valores de atributo link-entity en este ejemplo:

Atributo Importancia Description
name account Nombre lógico de la tabla de referencia
from primarycontactid Nombre de la columna de búsqueda en la tabla de cuentas de referencia
to contactid Clave principal de la tabla de contactos a la que se hace referencia
alias account Se recomienda un valor para link-entity con una relación de uno a varios. Si no se proporciona un alias, se genera un alias predeterminado. En este ejemplo, si no se proporciona ningún alias, los datos se devuelven con una columna denominada account1.name.
link-type Sin establecer Cuando no se establece ningún valor, el valor predeterminado es inner

Los resultados incluyen los mismos registros y datos que la consulta anterior mediante la relación de varios a uno, salvo que la "entidad padre" ahora es contact en lugar de 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)      |
 -----------------------------------------------------------------

Relaciones de varios a varios

Las relaciones de muchos a muchos dependen de una tabla de intersección. Normalmente, una tabla de intersección tiene solo cuatro columnas, pero solo dos de ellas son importantes. Las dos columnas importantes coinciden con las columnas de clave principal de las tablas participantes.

Por ejemplo, la tabla de intersección TeamMembership admite la relación de muchos a muchos teammembership_association entre SystemUser y Team . Permite a los usuarios unirse a varios equipos y equipos tener varios usuarios. TeamMembership tiene estas columnas: systemuserid, teamid.

Si desea recuperar información sobre los usuarios y los equipos a los que pertenecen utilizando la relación teammembership_association muchos a muchos, puede utilizar esta consulta 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>

Hay dos entidades de vínculo anidadas.

  • El primero conecta systemuser a la tabla de intersección teammembership donde systemuserid = systemuserid.
  • La segunda conecta la tabla de intersección teammembership al equipo en el que teamid = teamid.

Los resultados deben tener un aspecto similar al siguiente:

 --------------------------------------
 | fullname             | team.name   |
 --------------------------------------
 | FirstName LastName   | org26ed931d |
 --------------------------------------
 | # PpdfCDSClient      | org26ed931d |
 --------------------------------------

Sin relación

Es posible especificar from atributos y to mediante columnas que no forman parte de una relación definida.

Por ejemplo, esta consulta busca pares de registros donde la columna Nombre de un registro de cuenta coincide con la columna FullName de un registro de contacto , independientemente de si se hacen referencia entre sí en cualquiera de las columnas de búsqueda.

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

Nota:

Es importante que las columnas especificadas en los from atributos y to sean del mismo tipo aunque no estén implicadas en una relación. El uso de columnas de diferentes tipos requerirá una conversión de tipos que pueda tener un impacto en el rendimiento y puede producir un error en algunos valores de columna.

Los siguientes tipos de columna no se pueden usar en los atributos from y to:

Algunas columnas se pueden usar en from y to atributos, pero podrían dar lugar a un rendimiento deficiente:

Buscar registros que no están en un conjunto

Puede usar FetchXml para crear una consulta para devolver registros que no están en un conjunto mediante una combinación externa izquierda. Una combinación externa izquierda devuelve todas las filas que satisfacen la combinación de la primera entrada con la segunda entrada. También devuelve todas las filas de la primera entrada que no tenían filas coincidentes en la segunda entrada. Las filas que no coinciden en la segunda entrada se devuelven como valores NULL.

Puede realizar una combinación externa izquierda en FetchXML mediante el atributo entityname en un elemento de condición. El entityname atributo es válido en condiciones, filtros y filtros anidados. Obtenga más información sobre los filtros acerca de la entidad de enlace.

Por ejemplo, la siguiente consulta devuelve todos los registros de cuentas sin contactos.

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

Los siguientes tipos de entidad de vínculo no corresponden directamente a los tipos de operador T-SQL JOIN y usan subconsultas en su lugar. Estos tipos proporcionan funcionalidades más avanzadas que puede usar para mejorar el rendimiento de las consultas y definir consultas más complejas.

Nombre Description
exists Una variante de inner que puede proporcionar ventajas de rendimiento. Usa una condición EXISTS en la where cláusula . Úselo cuando no sean necesarias varias copias de la fila primaria en los resultados. Más información sobre "exists" y "in"
in Una variante de inner que puede proporcionar ventajas de rendimiento. Usa una condición IN en la where cláusula . Úselo cuando no sean necesarias varias copias de la fila primaria en los resultados. Más información sobre "exists" e "in"
matchfirstrowusingcrossapply Variante de inner que puede proporcionar ventajas de rendimiento. Use este tipo cuando solo sea necesario un ejemplo único de una fila coincidente de la entidad vinculada y no sean necesarias varias copias de la fila primaria en los resultados. Más información sobre matchfirstrowusingcrossapply

exists y in son variantes de inner que usan condiciones diferentes (EXISTS e IN respectivamente) en la where cláusula para que no se devuelvan varias copias de la fila primaria en los resultados. Ninguno de estos tipos devuelve los valores de columna de las filas de la entidad vinculada.

exists

Estos ejemplos de FetchXml y SQL muestran los patrones aplicados con 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

Estos ejemplos de FetchXml y SQL muestran los patrones aplicados con 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>

El uso de los tipos de vínculo exists o in puede reducir el tamaño de los resultados intermedios o finales de la consulta, especialmente cuando existen muchas filas vinculadas coincidentes para las mismas filas primarias, o cuando se usan varias entidades de vínculo con el mismo elemento primario. El uso de los tipos de vínculo exists o in puede mejorar el rendimiento de la consulta en comparación con el tipo inner porque no requiere devolver un producto cartesiano que contenga todas las posibles permutaciones de filas de diferentes entidades vinculadas para cada fila primaria.

Estos tipos de vínculo también pueden permitir que Dataverse solo encuentre la primera fila de entidad vinculada coincidente para cada fila primaria, que es más eficaz que buscar todas las filas coincidentes de la entidad vinculada en una inner combinación.

Este tipo de vínculo produce un operador CROSS APPLY con una subconsulta usando top 1 después de este patrón:

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

El matchfirstrowusingcrossapply tipo de vínculo es equivalente al inner tipo, excepto que solo devuelve la fila primaria como máximo una vez. La fila principal solo se devuelve si hay filas coincidentes en la entidad vinculada, pero, a diferencia de in y tipos exists, devuelve valores de columna de una de las filas coincidentes de la entidad vinculada. Úselo cuando solo sea necesario un ejemplo único de una fila coincidente de la entidad vinculada y no sean necesarias varias copias de la fila primaria en los resultados.

Cuando se usa el matchfirstrowusingcrossapply tipo de vínculo, los nombres de las propiedades devueltas mediante la API web o los valores de la colecciónKeys Entity.Attributes del SDK para las columnas de tabla relacionadas son diferentes a otros tipos de combinaciones. Normalmente, estos seguirán el <tablealias>.<logicalname> formato. Sin embargo, para el matchfirstrowusingcrossapply tipo de vínculo, los valores SchemaName se usan sin el prefijo del alias de tabla.

Con el ejemplo de consulta anterior con cualquier otro tipo de vínculo, puede esperar que las propiedades o claves tengan estos nombres:

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

Pero con el tipo de matchfirstrowusingcrossapply vínculo, las propiedades o claves tienen estos nombres:

  • fullname
  • contactid
  • AccountId
  • Name

Pasos siguientes

Obtenga información sobre cómo ordenar filas.