此页面为机器翻译。请阅读英文原文。 English

IBSurgeon 文库

Firebird 2.0中的别名处理与歧义字段检测

Dmitry Yemanov,2007年11月9日

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以及更新表中的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