【问题标题】:Doing JOIN between H2 table and ResultSet (select from MySQL table)在 H2 表和 ResultSet 之间进行 JOIN(从 MySQL 表中选择)
【发布时间】:2020-01-27 14:34:09
【问题描述】:

我必须在我的 Java 应用程序中嵌入数据库、一个 MySQL 数据库和一个 H2 数据库。

我想在 H2 数据库上 CREATE TABLE 加入一个 H2 表和一个 ResultSet,即来自 MySQL 数据库的 SELECT

我想在 H2 数据库上执行这个查询。

CREATE TABLE TableName AS
  SELECT l.*, m.Act FROM temp AS l JOIN
    (SELECT p.DES_PR AS Act, c.DES_COM AS com FROM
      table_com AS c JOIN table_pr AS p
         ON c.COD_PR = p.COD_PR) AS m
    ON l.sel = m.com
ORDER BY Cod;

除了temp 之外的所有表都在 MySQL 数据库上。 temp 表在 H2 数据库中。

如何在 H2 数据库上创建TableName

【问题讨论】:

标签: mysql join jdbc h2 resultset


【解决方案1】:

您需要为要在 H2 中使用的每个 MySQL 表创建一个LINKED TABLE

CREATE LINKED TABLE tableName('', 'jdbc:mysql://.......', 'userName', 'password', 'tableNameInMySQL');

请参阅文档中的完整语法: https://h2database.com/html/commands.html#create_linked_table

然后,您将能够在 CREATE TABLEAS 子句的查询中以及在您需要它们的所有其他地方使用 tableName 作为 H2 中的表。

最后,当这些链接表不再使用时,您可以删除它们。

为了获得更好的性能,您还可以尝试使用带有 MySQL 表之间连接的查询来创建单个链接表,如文档中所述,查询必须用括号括起来。类似的东西

CREATE LINKED TABLE m('', 'jdbc:mysql://.......', 'userName', 'password',
'(SELECT p.DES_PR AS Act, c.DES_COM AS com FROM
      table_com AS c JOIN table_pr AS p
         ON c.COD_PR = p.COD_PR)');

并在您的查询中使用它

CREATE TABLE TableName AS
  SELECT l.*, m.Act FROM temp AS l JOIN
    m
    ON l.sel = m.com
ORDER BY Cod;

【讨论】:

  • 这可能确实是比我在评论 +1 中提出的建议更好的选择。假设 h2 数据库也可以对外部 RDMS 进行查询计划优化
  • 如果您使用源表(而不是查询)声明链接表,H2 会尝试从源数据库中读取其索引并尽可能使用它们。但是,您不应该期望总是选择最好的计划。对于您的用例,我不能说几个普通链接表或带有查询的链接表是否会更快。如果性能对您很重要,您应该自己将其与您的真实数据进行比较。
  • 我的意思是,如果您有一个类似于问题的用例,当来自另一个数据库的多个表连接在一起,最后它们与 H2 的一些自己的表连接时。这样的查询将由两个数据库一起执行,并且不经意间它不能像只使用自己的表的普通查询一样进行优化。
  • 我不是 topicstarter.. 但优化器可以检查哪些值是本地现有的并远程请求这些值并将集合合并在一起(本地/远程合并连接算法).. 但我们正在做很多事情现在在 RDMS 优化理论中偏离主题..
  • @Evgenij Ryazanov 当我尝试创建另一个链接表然后在此链接表上执行SELECT 时出现错误:org.h2.jdbc.JdbcSQLException: Column "COD" not found; SQL statement: 如何解决此错误?跨度>
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2015-05-21
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多