Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Zpracování aliasů a detekce nejednoznačných polí ve Firebirdu 2.0

Dmitry Yemanov, 9-Nov-2007

Zpracování aliasů a detekce nejednoznačných polí byla vylepšena ve Firebirdu 2.0.

Změny:

a) Pokud je u tabulky přítomen alias, musí být použit tento alias, nebo nesmí být použit žádný alias; samotný název tabulky již není platný.

b) Pole bez kvalifikátoru lze nyní použít na vyšší úrovni rozsahu. Vlastní úroveň rozsahu je kontrolována jako první a kontrola nejednoznačných polí se provádí na úrovni rozsahu.

Autor:

Arno Brinkman

Příklady:

a)

Pokud je přítomen alias, musí být použit, nebo nesmí být použit žádný alias.

Tento dotaz byl povolen ve FB1.5 a starších verzích:

SELECT

RDB$RELATIONS.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

ale nyní správně ohlásí chybu, že pole

“RDB$RELATIONS.RDB$RELATION_NAME” nebylo nalezeno.

Použijte toto (doporučené):

SELECT

R.RDB$RELATION_NAME

FROM

RDB$RELATIONS R

nebo tento příkaz:

SELECT

RDB$RELATION_NAME

FROM

RDB$RELATIONS R

Následující příkaz nyní správně použije FieldID z poddotazu

a z aktualizované tabulky:

UPDATE

TableA

SET

FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)

Ve Firebirdu je možné zadat alias u příkazu UPDATE, ale u mnoha

jiných databázových dodavatelů to není podporováno. Tyto SQL příkazy jsou

nyní lépe zaměnitelné mezi jinými SQL databázovými produkty.

Tento příklad nefungoval správně ve FB1.5 a starších verzích:

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)

Pokud RDB$RELATIONS obsahuje 90 záznamů, vrátil by 90 * 90 = 8100 záznamů,

ale ve FB2.0 správně vrátí 90 záznamů.

b)

Toto selhávalo ve FB1.5, ale je možné ve FB2.0:

SELECT

(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)

FROM

RDB$RELATIONS

Kontrola nejednoznačnosti v poddotazech. Následující dotaz běžel ve FB1.5

bez hlášení nejednoznačnosti, ale ve FB2.0 ji ohlásí:

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