Sql 使用内存数据库从多个数据库进行查询
如何使用内存中的数据库(如H2DB)编写下面的内部连接查询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
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