Обробка аліасів та виявлення неоднозначних полів у Firebird 2.0
Dmitry Yemanov, 9-лист-2007
Обробка псевдонімів та виявлення неоднозначних полів було покращено у Firebird 2.0.
Зміни:
a) Коли псевдонім присутній у таблиці, цей псевдонім має використовуватися, або не використовуватися взагалі; лише назва таблиці більше не є дійсною.
b) Поля без кваліфікатора тепер можна використовувати на вищому рівні області видимості. Власний рівень області видимості перевіряється першим, а перевірка неоднозначних полів виконується на рівні області видимості.
Автор:
Arno Brinkman
Приклади:
a)
Коли псевдонім присутній, він має використовуватися, або не використовуватися взагалі.
Цей запит був дозволений у 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 записів.
b)
Це не працювало у 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