Diese Seite wurde maschinell übersetzt. Lesen Sie das englische Original. English

IBSurgeon-Bibliothek

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