我需要制定一个查询来执行以下操作: 1)连接同一服务器上的两个(informix)SQL表(已经完成/工作) 2) 连接同一服务器上不同数据库中的第三个 SQL 表。
对于我的示例代码,我们在数据库 A 上使用 tableA 和 tableB,在数据库 B 上使用 tableC。
连接同一个数据库上的两个表是没有问题的。
SELECT tableA.columnA
tableB.columnA
FROM
tableA
JOIN
tableB
ON
tableB.columnSHARED = tableA.columnSHARED
WHERE
([where clauses are inconsequential for this])
现在,我似乎无法工作的是数据库 B 上的表 C 的第二个 JOIN 子句。我尝试过使用数据库名称前缀为所有表/列引用添加前缀,但这似乎不起作用。
澄清一下,两个数据库位于同一服务器上,运行这些命令的用户可以访问这两个数据库。我会提供一条错误消息,但是除了 X 行靠近字符位置 Y(第三个连接子句)处存在错误这一事实之外,Informix 并没有返回任何有用的信息。还有一个常见的链接:
databaseB.tableC.columnSHARED
我如何/可以将
databaseB.tableC
加入 databaseA.tableA
和 databaseA.tableB
?
编辑2:响应者的新净化查询:
SELECT FIRST 100
tableA.sharedColumn,
tableA.colA,
tableA.colB,
tableA.colC,
tableA.colD,
tableA.colE,
tableA.colF,
tableA.colG,
tableB.colA ,
databaseB:tableC.column
FROM
tableA
JOIN
tableB
ON
tableB.sharedColumn = tableA.sharedColumn
LEFT OUTER JOIN
databaseB:tableC
ON
databaseB:tableC.sharedColumn = databaseA:tableA.sharedColumn
WHERE
{where clauses}
假设当前数据库是保存这两个表的数据库,那么你可以这样写:
SELECT A.ColumnA,
B.ColumnB,
C.ColumnC
FROM tableA AS A
JOIN tableB AS B ON B.columnSHARED = A.columnSHARED
JOIN databaseB:tableC AS C ON C.columnSHARED = A.ColumnSHARED
WHERE ([…where clauses are inconsequential for this…])
表名的完整表示法是:
[database[@server]:][owner.]tablename
因此,你也可以写:
SELECT A.ColumnA,
B.ColumnB,
C.ColumnC
FROM databaseA:tableA AS A
JOIN databaseB:tableB AS B ON B.columnSHARED = A.columnSHARED
JOIN databaseB:tableC AS C ON C.columnSHARED = A.ColumnSHARED
WHERE ([…where clauses are inconsequential for this…])
无论当前数据库是哪个数据库,这都可以在当前服务器中正常工作。
这个答案假设数据库具有相同的日志记录模式。如果不这样做,您将无法进行数据库间连接。
我想知道是否可以创建一个连接两个数据库的查询,两个数据库都是informix,一个有日志,另一个没有......