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