sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

关于 union all 特性的说明

2020-11-18
sybn

以下信息对所有数据源都有效, 包括但不限于 jdbc, solr, es, mongo, hive, clickhouse, excel, csv, json 等

union all / union

  • 分库分表场景下, 需要同时查询多个库, 一般使用 union all 实现:
select * from db1.table limit 1
union all
select * from db2.table limit 1
union all
select * from db3.table limit 1
  • 如果要查询多个分库的数据, 此时 库名与表名 完全一致, 上述写法无法描述来自不同IP的数据, 则可以使用databaseAlias.
# 给 host1的db 起别名为 db1
sql.db1=jdbc:mysql://host1/db?...
sql.db1.databaseAlias=db1

# 给 host2的db 起别名为 db2
sql.db2=jdbc:mysql://host2/db?...
sql.db2.databaseAlias=db2

# 给 host3的db 起别名为 db3
sql.db3=jdbc:mysql://host3/db?...
sql.db4.databaseAlias=db3
  • 如果有大量db或者table需要使用相同的sql查询, 上述重复的sql代码可以使用 mybatis 风格的 for 循环简化.
<foreach item="db" collection="'db1,db2,db3,db4,db5,db6'.split(',')" separator=" union all ">
select * from ${db}.table limit 1
</foreach>
  • 某些场景下, 希望允许被 union all 的子 sql 中个别sql报错时, sql继续执行返回剩余结果. 可以使用 ignore_error:
select * from db1.table limit 1
union all ignore_error
select * from db2.table limit 1
union all
select * from db3.table limit 1

当 union all / union 后面出现 ignore_error 时, 与其同级的子sql报错后会继续执行并忽略报错的子查询.

被忽略的错误信息可以在sql执行完成后, 使用 multipleDao.getWarningMessage() 获取.

  • 某些场景下, 希望允许被 union all 的子 sql 并行执行. 可以使用 concurrent:
select * from db1.table limit 1
union all concurrent = 5
select * from db2.table limit 1
union all
select * from db3.table limit 1

上一篇 建表语句转换

Comments

暂不开放评论! 可微信联系