Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. English

Бібліотека IBSurgeon

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