Gestione degli alias e rilevamento dei campi ambigui in Firebird 2.0
Dmitry Yemanov, 9-Nov-2007
La gestione degli alias e il rilevamento dei campi ambigui sono stati migliorati in Firebird 2.0.
Modifiche:
a) Quando è presente un alias su una tabella, deve essere usato quell’alias oppure nessun alias
del tutto; il solo nome della tabella non è più valido.
b) I campi senza qualificatore possono ora essere usati a un livello di scope superiore. Il proprio
livello di scope viene controllato per primo e il controllo dei campi ambigui viene eseguito a livello di scope.
Autore:
Arno Brinkman
Esempi:
a)
Quando è presente un alias, deve essere usato oppure non deve essere usato alcun alias.
Questa query era consentita in FB1.5 e versioni precedenti:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
ma ora segnalerà correttamente un errore indicando che il campo
“RDB$RELATIONS.RDB$RELATION_NAME” non è stato trovato.
Usare questa (preferita):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
oppure questa istruzione:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
L’istruzione seguente ora userà correttamente il FieldID dalla subselect
e dalla tabella in aggiornamento:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
In Firebird è possibile assegnare un alias a un’istruzione UPDATE, ma molti
altri vendor di database non supportano questa funzionalità. Queste istruzioni SQL
sono ora meglio intercambiabili con altri prodotti SQL.
Questo esempio non funzionava correttamente in FB1.5 e versioni precedenti:
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)
Se RDB$RELATIONS contiene 90 record, restituirebbe 90 * 90 = 8100 record,
ma in FB2.0 restituirà correttamente 90 record.
b)
Questo falliva in FB1.5, ma è possibile in FB2.0:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Controllo dell’ambiguità nelle subselect. La query seguente veniva eseguita in FB1.5
senza segnalare ambiguità, ma in FB2.0 la segnalerà:
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