Table de requête de base de données

Une table de requête de base de données est une table nommée qui contient une requête spécifique à la base de données plutôt qu'une référence à une table de base de données ou à une vue de base de données existante. La requête est écrite dans la syntaxe SQL de la base de données et doit être utilisée lorsqu'une requête ne peut pas être spécifiée comme requête MISQL (par exemple, vous devez utiliser des sous-requêtes, des jointures externes, etc.) ou lorsqu'elle est plus performante qu'une table de vue nommée. Tenez compte des éléments suivants lorsque vous utilisez une table de requête de base de données :

  • Si la structure des tables ou des vues référencées dans la requête est mise à jour, définissez l'attribut volatile sur true. Cela a un impact sur les performances, car les métadonnées de la table sont recréées à chaque requête.

  • Une table nommée basée sur une requête de base de données ne prend pas en charge les opérations d'insertion, de mise à jour ni de suppression.
  • Les bases de données prises en charge incluent Oracle, SQL Server et PostGIS.
  • Si une requête renvoie une géométrie, la colonne de géométrie doit être définie dans l'élément DBDataSourceMetadata.
  • Si une requête renvoie une clé primaire, elle doit être définie dans l'élément KeyAttributes.

La table de requête de base de données est similaire à une table de vue. Cependant, il existe des conditions pour préférer l'une par rapport à l'autre. Voir Table de vue pour plus de détails. Les tableaux suivants répertorient les principales différences entre les deux :

Tableau 1. Comparaison d'une table de requête de base de données à une table de vue
Table Vue Table de requête de base de données

Utilise une requête MISQL

Utilise une requête spécifique à la base de données, analogue à une vue créée dans la base de données
La requête de jointure prend en charge les tables nommées de différentes sources de données La requête de jointure doit référencer les tables et les vues au sein de la même base de données
Délègue les opérateurs en fonction du fournisseur de données Délègue uniquement les opérateurs Attributes Comparison et EnvelopeIntersects
Ne prend pas en charge les requêtes SQL imbriquées Prend en charge les requêtes SQL imbriquées et spécifiques à la base de données

Règles de délégation

Les opérateurs Attribute Comparison et EnvelopesIntersect seront délégués à la base de données.

Exemple

Voici un exemple d'une table de requête de base de données.

<?xml version="1.0" encoding="UTF-8"?>
<NamedDataSourceDefinition xmlns="http://www.mapinfo.com/mxp" xmlns:gml="http://www.opengis.net/gml" version="MXP_NamedResource_1_5">
   <ConnectionSet>
      <NamedConnectionRef resourceID="/oracle_db_connection">
         <ConnectionName>connection1</ConnectionName>
      </NamedConnectionRef>
   </ConnectionSet>
   <DataSourceDefinitionSet>
      <DBDataSourceDefinition id="id1" readOnly="false" volatile="false">
         <DataSourceName>WORLD</DataSourceName>
         <ConnectionMember>
            <ConnectionName>connection1</ConnectionName>
         </ConnectionMember>
         <DBQuery>
            <Query>Select MI_Prinx, GEOM, Country, Capital from World where Country in('Canada','India')</Query>
         </DBQuery>
         <DBDataSourceMetadata>
            <FeatureGeometryAttribute srsName="epsg:4326">GEOM</FeatureGeometryAttribute>
            <KeyAttributes>
               <AttributeName>MI_Prinx</AttributeName>      
            </KeyAttributes>
         </DBDataSourceMetadata>
      </DBDataSourceDefinition>
   </DataSourceDefinitionSet>
   <DataSourceRef ref="id1" />
</NamedDataSourceDefinition>