Rukovanje aliasima i detekcija dvosmislenih polja u Firebird 2.0
Dmitry Yemanov, 9-нов-2007
Обрада алијаса и детектовање двосмислених поља је побољшано у Firebird 2.0.
Промене:
а) Када је алијас присутан на табели, тај алијас мора бити коришћен или се не сме користити ниједан алијас,
само име табеле више није важеће.
б) Поља без квалификатора сада могу бити коришћена на вишем нивоу опсега. Сопствени ниво опсега
се проверава прво и провера двосмислених поља се врши на нивоу опсега.
Аутор:
Arno Brinkman
Примери:
а)
Када је алијас присутан, мора се користити или се не сме користити ниједан алијас.
Овај упит је био дозвољен у FB1.5 и ранијим верзијама:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
али ће сада исправно пријавити грешку да поље
“RDB$RELATIONS.RDB$RELATION_NAME” није могло бити пронађено.
Користите ово (пожељно):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
или ову изјаву:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
Изјава испод ће сада исправно користити FieldID из подупита
и из табеле која се ажурира:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
У Firebird-у је могуће дати алијас у UPDATE изјави, али код
многих других произвођача база података то није подржано. Ове SQL изјаве су
сада боље заменљиве између других SQL производа база података.
Овај пример није радио исправно у FB1.5 и ранијим верзијама:
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)
Ако RDB$RELATIONS садржи 90 записа, вратило би 90 * 90 = 8100 записа,
али у FB2.0 ће исправно вратити 90 записа.
б)
Ово није успевало у FB1.5, али је могуће у FB2.0:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Провера двосмислености у подупитима. Следећи упит је радио на FB1.5
без пријављивања двосмислености, али ће је пријавити у FB2.0:
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