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を正しく使用します:
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