Gestion des alias et détection des champs ambigus dans Firebird 2.0
Dmitry Yemanov, 9-Nov-2007
La gestion des alias et la détection des champs ambigus ont été améliorées dans Firebird 2.0.
Modifications :
a) Lorsqu’un alias est présent sur une table, cet alias doit être utilisé ou aucun alias du tout, le nom de table seul n’est plus valide.
b) Les champs sans qualificatif peuvent désormais être utilisés à un niveau de portée supérieur. Le niveau de portée propre est vérifié en premier et la détection des champs ambigus est effectuée au niveau de la portée.
Auteur :
Arno Brinkman
Exemples :
a)
Lorsqu’un alias est présent, il doit être utilisé ou aucun alias du tout ne doit être utilisé.
Cette requête était autorisée dans FB1.5 et les versions antérieures :
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
mais signalera désormais correctement une erreur indiquant que le champ
“RDB$RELATIONS.RDB$RELATION_NAME” n’a pas pu être trouvé.
Utilisez ceci (préféré) :
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
ou cette instruction :
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
L’instruction ci-dessous utilisera désormais correctement le FieldID de la sous-sélection
et de la table mise à jour :
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
Dans Firebird, il est possible de donner un alias à une instruction UPDATE, mais chez
de nombreux autres fournisseurs de bases de données, cela n’est pas pris en charge. Ces instructions SQL sont
désormais mieux interchangeables entre d’autres produits de bases de données SQL.
Cet exemple ne s’exécutait pas correctement dans FB1.5 et les versions antérieures :
SELECT
RDB$RELATIONS.RDB$RELATION_NAME,
R2.RDB$RELATION_NAME
FROM
RDB$RELATIONS
JOIN RDB$RELATIONS R2 ON
(R2.RDB$RELATION_NAME = RDB$RELATIONS.RDB$RELATION_NAME)
Si RDB$RELATIONS contient 90 enregistrements, cela renvoyait 90 * 90 = 8100 enregistrements,
mais dans FB2.0, cela renverra correctement 90 enregistrements.
b)
Cela échouait dans FB1.5, mais est possible dans FB2.0 :
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Vérification de l’ambiguïté dans les sous-sélections. La requête ci-dessous s’exécutait dans FB1.5
sans signaler d’ambiguïté, mais la signalera dans FB2.0 :
SELECT
(SELECT
FIRST 1 RDB$RELATION_NAME
FROM
RDB$RELATIONS R1
JOIN RDB$RELATIONS R2 ON
(R2.RDB$RELATION_NAME = R1.RDB$RELATION_NAME))
FROM
RDB$DATABASE