Обработка алиасов и обнаружение неоднозначных полей в Firebird 2.0
Дмитрий Еманов, 9 ноября 2007 г.
Обработка алиасов и обнаружение неоднозначных полей были улучшены в Firebird 2.0.
Изменения:
a) Когда у таблицы присутствует алиас, необходимо использовать именно его или не использовать алиас вовсе - только имя таблицы больше не является допустимым.
b) Поля без квалификатора теперь можно использовать на более высоком уровне области видимости. Сначала проверяется собственная область видимости, а проверка на неоднозначность полей выполняется на уровне области видимости.
Автор:
Арно Бринкман
Примеры:
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