Échantillonnage à partir d’une table dérivée (derived table)
Table dérivé — est la commande SELECT
correcte, entre parenthèses, éventuellement marquée d’un alias de table et d’alias de champ.
<derived table> ::= (<select-query>) [[AS] derived-table-alias] [(<derived-column-aliases>)] <derived-column-aliases> := column-alias [, column-alias ...] <lateral-derived-table> ::= LATERAL <derived-table>
L’ensemble de données retourné par une telle déclaration est une table virtuelle dans laquelle on peut effectuer des requêtes comme s’il s’agissait d’une table ordinaire.
La table dérivée dans la requête ci-dessous fournit une liste de noms de tables dans la base de données et le nombre de colonnes qu’elles contiennent. La requête de table dérivée fournit le nombre de champs et le nombre de tables avec ce nombre de champs.
SELECT
FIELDCOUNT,
COUNT(RELATION) AS NUM_TABLES
FROM (SELECT
R.RDB$RELATION_NAME RELATION,
COUNT(*) AS FIELDCOUNT
FROM RDB$RELATIONS R
JOIN RDB$RELATION_FIELDS RF
ON RF.RDB$RELATION_NAME = R.RDB$RELATION_NAME
GROUP BY RELATION)
GROUP BY FIELDCOUNT
Un exemple trivial démontrant l’utilisation d’un alias de table dérivé et d’une liste d’alias de colonne (tous deux facultatifs) :
SELECT
DBINFO.DESCR, DBINFO.DEF_CHARSET
FROM (SELECT *
FROM RDB$DATABASE) DBINFO (DESCR, REL_ID, SEC_CLASS, DEF_CHARSET)
Note
|
Notes:
|
Voici un exemple de la manière dont l’utilisation de tableaux dérivés peut simplifier la solution d’un problème.
Supposons que nous ayons un tableau COEFFS
contenant les coefficients d’une série d’équations quadratiques que nous allons résoudre. Il peut être défini comme suit :
CREATE TABLE coeffs (
a DOUBLE PRECISION NOT NULL,
b DOUBLE PRECISION NOT NULL,
c DOUBLE PRECISION NOT NULL,
CONSTRAINT chk_a_not_zero CHECK (a <> 0)
)
En fonction des valeurs des coefficients a, b et c, chaque équation peut avoir zéro, une ou deux solutions. Nous pouvons trouver ces solutions en utilisant une requête à un niveau dans la table COEFFS, mais le code d’une telle requête serait lourd et certaines valeurs (comme les discriminants) seraient calculées plusieurs fois dans chaque ligne.
Si nous utilisons un tableau dérivé, la requête peut être rendue beaucoup plus élégante :
SELECT
IIF (D >= 0, (-b - sqrt(D)) / denom, NULL) AS sol_1,
IIF (D > 0, (-b + sqrt(D)) / denom, NULL) AS sol_2
FROM
(SELECT b, b*b - 4*a*c, 2*a FROM coeffs) (b, D, denom)
Si nous voulons montrer les coefficients à côté des solutions des équations, nous pouvons modifier la requête comme suit :
SELECT
a, b, c,
IIF (D >= 0, (-b - sqrt(D)) / denom, NULL) sol_1,
IIF (D > 0, (-b + sqrt(D)) / denom, NULL) sol_2
FROM
(SELECT a, b, c, b*b - 4*a*c AS D, 2*a AS denom
FROM coeffs)
Notez que dans la première requête, nous avons attribué des alias à tous les champs de la table dérivée sous forme de liste après la table, et que dans la seconde, nous ajoutons des alias dans la requête de la table dérivée selon les besoins. Ces deux méthodes sont correctes, car elles garantissent que chaque champ de la table dérivée a un nom unique lorsqu’elles sont appliquées correctement.
Note
|
En fait, toutes les colonnes calculées dans la table dérivée seront recalculées autant de fois qu’elles sont spécifiées dans la requête principale. Cela peut conduire à des résultats inattendus lors de l’utilisation de fonctions non déterministes. L’exemple suivant montre ce qui a été dit :
le résultat de cette demande sera C1 80AAECED-65CD-4C2F-90AB-5D548C3C7279 C2 C1214CD3-423C-406D-B5BD-95BF432ED3E3 C3 EB176C10-F754-4689-8B84-64B666381154 Vous pouvez utiliser la méthode suivante pour matérialiser le résultat de la fonction GEN_UUID :
le résultat de cette demande sera C1 80AAECED-65CD-4C2F-90AB-5D548C3C7279 C2 80AAECED-65CD-4C2F-90AB-5D548C3C7279 C3 80AAECED-65CD-4C2F-90AB-5D548C3C7279 ou envelopper la fonction GEN_UUID dans une sous-requête
Il s’agit d’une caractéristique de l’implémentation actuelle qui peut être modifiée dans les futures versions du serveur. |