Эта страница переведена машинным переводом. Читайте английский оригинал. English

Библиотека IBSurgeon

Обработка алиасов и обнаружение неоднозначных полей в 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