Esta página fue traducida automáticamente. Lee el original en inglés. English

Biblioteca de IBSurgeon

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