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