Umgang mit Aliasen und Erkennung mehrdeutiger Felder in Firebird 2.0
Dmitry Yemanov, 9-Nov-2007
Die Behandlung von Aliasen und die Erkennung mehrdeutiger Felder wurde in Firebird 2.0 verbessert.
Änderungen:
a) Wenn ein Alias für eine Tabelle vorhanden ist, muss dieser Alias verwendet werden oder gar kein Alias - nur der Tabellenname ist nicht mehr gültig.
b) Felder ohne Qualifizierer können nun in einer höheren Gültigkeitsebene verwendet werden. Die eigene Gültigkeitsebene wird zuerst geprüft, und die Prüfung auf mehrdeutige Felder erfolgt auf Gültigkeitsebene.
Autor:
Arno Brinkman
Beispiele:
a)
Wenn ein Alias vorhanden ist, muss er verwendet werden oder es darf gar kein Alias verwendet werden.
Diese Abfrage war in FB1.5 und früheren Versionen erlaubt:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
wird nun jedoch korrekt einen Fehler melden, dass das Feld
“RDB$RELATIONS.RDB$RELATION_NAME” nicht gefunden werden konnte.
Verwenden Sie dies (bevorzugt):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
oder diese Anweisung:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
Die folgende Anweisung verwendet nun korrekt die FieldID aus der Unterabfrage und aus der zu aktualisierenden Tabelle:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
In Firebird ist es möglich, einer UPDATE-Anweisung einen Alias zu geben, aber viele andere Datenbankanbieter unterstützen dies nicht. Diese SQL-Anweisungen sind nun besser zwischen anderen SQL-Datenbankprodukten austauschbar.
Dieses Beispiel lief in FB1.5 und früheren Versionen nicht korrekt:
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)
Wenn RDB$RELATIONS 90 Datensätze enthält, würde es 90 * 90 = 8100 Datensätze zurückgeben, aber in FB2.0 wird es korrekt 90 Datensätze zurückgeben.
b)
Dies schlug in FB1.5 fehl, ist aber in FB2.0 möglich:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Mehrdeutigkeitsprüfung in Unterabfragen. Die folgende Abfrage lief in FB1.5 ohne Meldung einer Mehrdeutigkeit, wird sie aber in FB2.0 melden:
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