Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

Obsługa aliasów i wykrywanie niejednoznacznych pól w Firebird 2.0

Dmitry Yemanov, 9-listopad-2007

Obsługa aliasów i wykrywanie niejednoznacznych pól zostało ulepszone w Firebird 2.0.

Zmiany:

a) Gdy alias jest obecny na tabeli, należy używać tego aliasu lub nie używać żadnego aliasu w ogóle - sama nazwa tabeli nie jest już poprawna.

b) Pola bez kwalifikatora mogą być teraz używane na wyższym poziomie zakresu. Własny poziom zakresu jest sprawdzany jako pierwszy, a sprawdzanie niejednoznacznych pól odbywa się na poziomie zakresu.

Autor:

Arno Brinkman

Przykłady:

a)

Gdy alias jest obecny, należy go używać lub nie używać żadnego aliasu w ogóle.

To zapytanie było dozwolone w FB1.5 i wcześniejszych wersjach:

SELECT

RDB$RELATIONS.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

ale teraz poprawnie zgłosi błąd, że pole

“RDB$RELATIONS.RDB$RELATION_NAME” nie mogło zostać znalezione.

Użyj tego (zalecane):

SELECT

R.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

lub tego polecenia:

SELECT

RDB$RELATION_NAME

FROM

RDB$RELATIONS R

Poniższe polecenie będzie teraz poprawnie używać FieldID z podzapytania

oraz z aktualizowanej tabeli:

UPDATE

TableA

SET

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

W Firebirdzie można nadać alias w poleceniu UPDATE, ale wielu innych

producentów baz danych tego nie obsługuje. Te polecenia SQL są teraz

lepiej wymienne między różnymi produktami baz danych SQL.

Ten przykład nie działał poprawnie w FB1.5 i wcześniejszych:

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)

Jeśli RDB$RELATIONS zawiera 90 rekordów, zwracałoby 90 * 90 = 8100 rekordów,

ale w FB2.0 poprawnie zwróci 90 rekordów.

b)

To nie działało w FB1.5, ale jest możliwe w FB2.0:

SELECT

(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)

FROM

RDB$RELATIONS

Sprawdzanie niejednoznaczności w podzapytaniach. Poniższe zapytanie działało w FB1.5

bez zgłaszania niejednoznaczności, ale w FB2.0 zgłosi ją:

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