Deze pagina is automatisch vertaald. Lees het Engelse origineel. English

IBSurgeon-bibliotheek

Aliasafhandeling en detectie van ambigue velden in Firebird 2.0

Dmitry Yemanov, 9-nov-2007

De afhandeling van aliassen en het detecteren van ambigue velden is verbeterd in Firebird 2.0.

Wijzigingen:

a) Wanneer een alias aanwezig is op een tabel, moet die alias worden gebruikt of helemaal geen alias; alleen de tabelnaam is niet langer geldig.

b) Velden zonder kwalificatie kunnen nu op een hoger scopieniveau worden gebruikt. Het eigen scopieniveau wordt eerst gecontroleerd en de controle op ambigue velden gebeurt op scopieniveau.

Auteur:

Arno Brinkman

Voorbeelden:

a)

Wanneer een alias aanwezig is, moet deze worden gebruikt of er mag helemaal geen alias worden gebruikt.

Deze query was toegestaan in FB1.5 en eerdere versies:

SELECT

RDB$RELATIONS.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

maar zal nu correct een fout melden dat het veld

“RDB$RELATIONS.RDB$RELATION_NAME” niet kon worden gevonden.

Gebruik dit (aanbevolen):

SELECT

R.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

of deze verklaring:

SELECT

RDB$RELATION_NAME

FROM

RDB$RELATIONS R

De onderstaande verklaring zal nu correct de FieldID van de subselect en van de bij te werken tabel gebruiken:

UPDATE

TableA

SET

FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)

In Firebird is het mogelijk om een alias te geven aan een update-verklaring, maar bij veel andere databaseleveranciers wordt dit niet ondersteund. Deze SQL-verklaringen zijn nu beter uitwisselbaar tussen andere SQL-databaseproducten.

Dit voorbeeld werkte niet correct in FB1.5 en eerdere versies:

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)

Als RDB$RELATIONS 90 records bevat, zou het 90 * 90 = 8100 records retourneren, maar in FB2.0 zal het correct 90 records retourneren.

b)

Dit mislukte in FB1.5, maar is mogelijk in FB2.0:

SELECT

(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)

FROM

RDB$RELATIONS

Controle op ambiguïteit in subselects. De onderstaande query draaide in FB1.5 zonder een ambiguïteit te melden, maar zal dit in FB2.0 wel 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