Manejo de alias y detección de campos ambiguos en Firebird 2.0
Dmitry Yemanov, 9-Nov-2007
El manejo de alias y la detección de campos ambiguos se ha mejorado en Firebird 2.0.
Cambios:
a) Cuando hay un alias presente en una tabla, ese alias debe usarse o no usar ningún alias en absoluto; el nombre de la tabla solo ya no es válido.
b) Los campos sin calificador ahora pueden usarse en un nivel de ámbito superior. El propio nivel de ámbito se verifica primero y la comprobación de campos ambiguos se realiza a nivel de ámbito.
Autor:
Arno Brinkman
Ejemplos:
a)
Cuando hay un alias presente, debe usarse o no debe usarse ningún alias en absoluto.
Esta consulta estaba permitida en FB1.5 y versiones anteriores:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
pero ahora reportará correctamente un error de que el campo
“RDB$RELATIONS.RDB$RELATION_NAME” no se pudo encontrar.
Use esto (preferido):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
o esta declaración:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
La declaración a continuación ahora usará correctamente el FieldID de la subconsulta
y de la tabla que se actualiza:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
En Firebird es posible asignar un alias mediante una declaración de actualización, pero
en muchos otros proveedores de bases de datos esto no es compatible. Estas declaraciones SQL
ahora son mejor intercambiables entre otros productos de bases de datos SQL.
Este ejemplo no se ejecutaba correctamente en FB1.5 y versiones anteriores:
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 contiene 90 registros, devolvería 90 * 90 = 8100 registros,
pero en FB2.0 devolverá correctamente 90 registros.
b)
Esto fallaba en FB1.5, pero es posible en FB2.0:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Comprobación de ambigüedad en subconsultas. La consulta a continuación se ejecutaba en FB1.5
sin reportar ambigüedad, pero la reportará en 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