Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Thư viện IBSurgeon

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