Esta página foi traduzida por máquina. Leia o original em inglês. English

Biblioteca IBSurgeon

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