Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用内存数据库从多个数据库进行查询_Sql_Database_Hsqldb_H2_In Memory Database - Fatal编程技术网

Sql 使用内存数据库从多个数据库进行查询

Sql 使用内存数据库从多个数据库进行查询,sql,database,hsqldb,h2,in-memory-database,Sql,Database,Hsqldb,H2,In Memory Database,如何使用内存中的数据库(如H2DB)编写下面的内部连接查询 select * from emp e inner join other_db.dept d on e.id=d.eid emp表在db1数据库中创建,dept表在其他_db数据库中创建 内存中数据库的问题是数据库名与数据源不关联。因此,我们不能在查询中使用其他_db.dept 正如Thomas Mueller所建议的,下面的代码是用Java和Spring框架编写的,带有链接表 Spring配置文件: <jdbc:embedde

如何使用内存中的数据库(如H2DB)编写下面的内部连接查询

select * from emp e inner join other_db.dept d on e.id=d.eid
emp表在db1数据库中创建,dept表在其他_db数据库中创建

内存中数据库的问题是数据库名与数据源不关联。因此,我们不能在查询中使用其他_db.dept

正如Thomas Mueller所建议的,下面的代码是用Java和Spring框架编写的,带有链接表

Spring配置文件:

<jdbc:embedded-database id="db1DataSource" type="H2">
    <jdbc:script location="classpath:schema-db1.sql" />
</jdbc:embedded-database>

<jdbc:embedded-database id="otherdbDataSource" type="H2">
    <jdbc:script location="classpath:schema-other.sql" />
</jdbc:embedded-database>
schema-other.sql

SET MODE MSSQLServer

CREATE TABLE dept ( id int NOT NULL, name varchar(20) NOT NULL, eid int NOT NULL)
现在,我可以写下以下查询:

select * from emp e inner join other_db.dept d on e.id=d.eid
事实上,我在运行代码时遇到以下异常:

Table dept not found
H2支持访问另一个数据库中的表。如果您先创建一个链接表,然后可以像在问题的查询中那样使用它。源和/或目标数据库是否在内存中并不重要

表名与数据库元数据标识符一样区分大小写,因此如果在H2:
create table dept
中创建这样的表,则链接表需要大写:

CREATE LINKED TABLE other_db
('org.h2.Driver', 'jdbc:h2:mem:test', 'sa', '', 'DEPT')

我在同一个数据库下创建了两个模式,在h2 url中使用INIT属性,如下所示:

<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="db1DataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS first_db\;SET SCHEMA first_db" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="db1DataSource">
    <jdbc:script location="classpath:schema-db1.sql" />
</jdbc:initialize-database>

<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="otherdbDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS other_db\;SET SCHEMA other_db" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="otherdbDataSource">
    <jdbc:script location="classpath:schema-other.sql" />
</jdbc:initialize-database>

分别运行每个应用程序,然后使用应用程序代码将它们连接起来。细节取决于编程语言。是的,我暂时这样做。我正在使用H2内存数据库进行单元测试。将查询分成两部分以使其可测试不是一个好方法。@Vikas Sharma-在更新的问题中,您只有一个datatabase URL(
jdbc:h2:mem:test
)。另一个数据库URL是什么?您能帮助我在上面的Spring配置中创建2个内存中H2数据库所需的更改吗?使用链接表,我们无法编写如下查询:select*from emp e inner join other_db.dept d on e.id=d.eid。使用链接表,我们可以创建其他_db.dept的链接,并编写如下查询:select*from emp e INTERNAR join dept d on e.id=d.eid。我正在使用H2内存数据库编写单元测试。并且,在不支持链接表的实际生产代码上使用SQL Server。如果将链接表放在名为
other_db
的架构中,可以将查询编写为
select*from emp e internal join other_db.dept d on e.id=d.eid
。我可能遗漏了一些要点。我已经用使用链接表编写的代码更新了这个问题。
<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="db1DataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS first_db\;SET SCHEMA first_db" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="db1DataSource">
    <jdbc:script location="classpath:schema-db1.sql" />
</jdbc:initialize-database>

<bean class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" id="otherdbDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS other_db\;SET SCHEMA other_db" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="otherdbDataSource">
    <jdbc:script location="classpath:schema-other.sql" />
</jdbc:initialize-database>
select * from emp e inner join other_db.dept d on e.id=d.eid