如何连接两个 Firebird 数据库中的表?

问题描述

目前我正在使用 Embarcadero C++Builder 10.3 Community Edition 和 Firebird 和 FlameRobin 创建一个简单的库项目来创建数据库

到目前为止,我只需要使用连接到单个数据库的简单查询。因此,我使用 TFDConnectionTFDPhysFbDriverLink 连接到 .fdb 文件。然后,TFDQuery 创建 sql 命令和 TDataSource效果很好。

不幸的是,现在我必须连接两个表。这个命令怎么写?我试过这个:

SELECT * FROM users_books 
join books on
users_books.id_book = books.id

其中 users_booksbooks数据库

我有一个错误

sql error code = -204
Table unkNown
BOOKS.

所以我想我必须以某种方式同时连接到这两个数据库。如何做到这一点?

解决方法

Firebird 数据库是孤立的,不知道其他数据库。因此,无法使用普通的 select 语句跨数据库连接表。

您可以做的是使用 PSQL(程序 SQL),例如在 EXECUTE BLOCK 中。然后,您可以使用 FOR EXECUTE STATEMENT ... ON EXTERNAL 循环其他数据库中的表,然后使用 FOR SELECT '手动'加入本地表(反之亦然)。

例如(假设远程数据库中有一个表user_books,当前数据库中有一个表books):

execute block
  returns (book_id integer,book_title varchar(100),username varchar(50))
as
begin
  for execute statement 'select book_id,username from user_books'
    on external 'users_books' /* may need AS USER and PASSWORD clause as well */
    into book_id,username do
  begin
    for select book_title from books where id = :book_id
      into book_title do
    begin
      suspend;
    end
  end
end