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