如何使用内存数据库(如H2 db。
)编写下面的内连接查询select * from emp e inner join other_db.dept d on e.id=d.eid
emp表在db1数据库中创建,dept表在other_db数据库中创建。
内存数据库的问题是数据库名称与数据源无关。因此,我们不能在查询中使用other_db.dept。
正如Thomas Mueller所建议的那样,请在下面找到用Java和Spring框架编写的代码和LINKED TABLE
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>
架构db1.sql
SET MODE MSSQLServer
CREATE TABLE emp ( id int NOT NULL, name varchar(30) NOT NULL)
CREATE LINKED TABLE other_db ('org.h2.Driver', 'jdbc:h2:mem:test', 'sa', '', 'dept')
架构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
答案 0 :(得分:1)
H2支持Linked Tables访问另一个数据库中的表。如果先创建链接表,则可以像在问题中的查询中一样使用它。源数据库和/或目标数据库是否在内存中并不重要。
表名称区分大小写与数据库元数据标识符相同,因此如果在H2:CREATE TABLE dept
中创建这样的表,则链接表必须为大写:
CREATE LINKED TABLE other_db
('org.h2.Driver', 'jdbc:h2:mem:test', 'sa', '', 'DEPT')
答案 1 :(得分:1)
我在同一个数据库下创建了两个模式,使用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>
现在,能够在qyery以下运行:
select * from emp e inner join other_db.dept d on e.id=d.eid