我试图将数据库A中table1的一行插入数据库B中的table2 所有在firebird并没有看起来像标准方式工作。
insert * from A.table1 into B.table2 where <condition>
感谢
答案 0 :(得分:1)
术语完全限定名称似乎是跨数据库(或目录)引用的SQL Server特定术语。在Firebird中,数据库是独立且孤立的:他们不了解其他数据库的存在。因此无法直接引用其他数据库中的表。
使用EXECUTE STATEMENT
扩展名ON EXTERNAL
,可以从PSQL块(存储过程或EXECUTE BLOCK
)中访问另一个数据库,但它不像INSERT INTO ... SELECT
。
例如(注意:我没有测试它,所以它可能有一些语法错误):
EXECUTE BLOCK
DECLARE varColumn1 VARCHAR(10);
DECLARE varColumn2 VARCHAR(10);
BEGIN
FOR EXECUTE 'SELECT column1, column2 FROM tableA'
ON EXTERNAL 'localhost:/path/to/dbA'
AS USER 'userDBa' PASSWORD 'pwdUserDBa'
INTO :varColumn1, :varColumn2
BEGIN
INSERT INTO tableB(column1, column2) VALUES (:varColumn1, :varColumn2);
END
END
您在问题中引用的语法不是标准&#39;。 SQL:2011标准将INSERT
定义为:
<insert statement> ::=
INSERT INTO <insertion target> <insert columns and source>
<insertion target> ::=
<table name>
<insert columns and source> ::=
<from subquery>
| <from constructor>
| <from default>
<from subquery> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<query expression>
<from constructor> ::=
[ <left paren> <insert column list> <right paren> ]
[ <override clause> ]
<contextually typed table value constructor>
<override clause> ::=
OVERRIDING USER VALUE
| OVERRIDING SYSTEM VALUE
<from default> ::=
DEFAULT VALUES
<insert column list> ::=
<column name list>
换句话说,来自另一个表的INSERT
将是:
INSERT INTO tableB (column1, column2, ...) SELECT column1, column2, ... FROM tableA
从技术上讲,您可以关闭显式列定义,但通常最好是明确的。
这也是Firebird支持的语法(尽管Firebird不支持SQL:2011标准中列出的所有选项),请参阅Interbase 6.0语言参考(+ Firebird 2.5语言参考更新),两者均可从{{3 }}:
INSERT [TRANSACTION transaction] INTO <object> [(col [, col …])]
{VALUES (<val> [, <val> …]) | <select_expr>};