Xử lý bí danh (alias) và phát hiện trường không rõ ràng trong Firebird 2.0
Dmitry Yemanov, 9-Thg11-2007
Xử lý bí danh (alias) và phát hiện trường không rõ ràng (ambiguous field) đã được cải thiện trong Firebird 2.0.
Các thay đổi:
a) Khi có bí danh trên một bảng, bí danh đó phải được sử dụng hoặc không sử dụng bí danh nào cả, chỉ dùng tên bảng là không còn hợp lệ nữa.
b) Các trường không có định danh (qualifier) giờ có thể được sử dụng ở mức phạm vi (scope level) cao hơn. Mức phạm vi của chính nó được kiểm tra trước và việc kiểm tra trường không rõ ràng được thực hiện ở mức phạm vi.
Tác giả:
Arno Brinkman
Ví dụ:
a)
Khi có bí danh, nó phải được sử dụng hoặc không được sử dụng bí danh nào cả.
Truy vấn này được phép trong FB1.5 và các phiên bản trước đó:
SELECT
RDB$RELATIONS.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
nhưng giờ sẽ báo lỗi chính xác rằng trường
“RDB$RELATIONS.RDB$RELATION_NAME” không thể tìm thấy.
Hãy sử dụng cách này (được khuyến nghị):
SELECT
R.RDB$RELATION_NAME
FROM
RDB$RELATIONS R
hoặc câu lệnh này:
SELECT
RDB$RELATION_NAME
FROM
RDB$RELATIONS R
Câu lệnh dưới đây giờ sẽ sử dụng chính xác FieldID từ truy vấn con (subselect) và từ bảng đang cập nhật:
UPDATE
TableA
SET
FieldA = (SELECT SUM(A.FieldB) FROM TableA A WHERE A.FieldID = TableA.FieldID)
Trong Firebird, có thể gán bí danh cho câu lệnh update, nhưng nhiều nhà cung cấp cơ sở dữ liệu khác không hỗ trợ điều này. Các câu lệnh SQL này giờ có thể tương thích tốt hơn giữa các sản phẩm cơ sở dữ liệu SQL khác.
Ví dụ này không chạy đúng trong FB1.5 và các phiên bản trước đó:
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)
Nếu RDB$RELATIONS chứa 90 bản ghi, nó sẽ trả về 90 * 90 = 8100 bản ghi, nhưng trong FB2.0 nó sẽ trả về chính xác 90 bản ghi.
b)
Điều này thất bại trong FB1.5, nhưng có thể thực hiện trong FB2.0:
SELECT
(SELECT RDB$RELATION_NAME FROM RDB$DATABASE)
FROM
RDB$RELATIONS
Kiểm tra tính không rõ ràng trong truy vấn con. Truy vấn dưới đây đã chạy trên FB1.5 mà không báo lỗi không rõ ràng, nhưng sẽ báo lỗi trong 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