Tratamento de aliases e detecção de campos ambíguos no Firebird 2.0
Dmitry Yemanov, 9-Nov-2007
O tratamento de aliases e a detecção de campos ambíguos foram melhorados no Firebird 2.0.
Alterações:
a) Quando um alias está presente em uma tabela, esse alias deve ser usado ou nenhum alias deve ser usado; apenas o nome da tabela não é mais válido.
b) Campos sem qualificador agora podem ser usados em um nível de escopo superior. O nível de escopo próprio é verificado primeiro e a verificação de campos ambíguos é feita no nível de escopo.
Autor:
Arno Brinkman
Exemplos:
a)
Quando um alias está presente, ele deve ser usado ou nenhum alias deve ser usado.
Esta consulta era permitida no FB1.5 e versões anteriores:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
mas agora reportará corretamente um erro informando que o campo
“RDB$RELATIONS.RDB$RELATION_NAME” não pôde ser encontrado.
Use esta (preferida):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
ou esta declaração:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
A declaração abaixo agora usará corretamente o FieldID da subconsulta
e da tabela que está sendo atualizada:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
No Firebird é possível atribuir um alias em uma declaração UPDATE, mas em
muitos outros fornecedores de banco de dados isso não é suportado. Essas declarações SQL
agora são melhor intercambiáveis entre outros produtos de banco de dados SQL.
Este exemplo não funcionava corretamente no FB1.5 e versões anteriores:
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)
Se RDB$RELATIONS contém 90 registros, retornaria 90 * 90 = 8100 registros,
mas no FB2.0 retornará corretamente 90 registros.
b)
Isso falhava no FB1.5, mas é possível no FB2.0:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Verificação de ambiguidade em subconsultas. A consulta abaixo funcionava no FB1.5
sem reportar ambiguidade, mas reportará no 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