一条 SQL 如何同时访问多个数据库
例题描述和简单分析
Oracle中有数据表sales,存了2013年的数据,如下:
ORDERID |
CLIENT |
SELLERID |
AMOUNT |
ORDERDATE |
57 |
JAXE |
5 |
17300 |
2013/1/2 |
60 |
PWQ |
16 |
3430 |
2013/1/5 |
61 |
SJCH |
19 |
1078 |
2013/1/8 |
62 |
JAXE |
11 |
8134 |
2013/1/6 |
63 |
SJCH |
16 |
5880 |
2013/1/10 |
… |
… |
… |
… |
… |
MySQL中有数据表sales,存了2014年的数据,如下:
ORDERID |
CLIENT |
SELLERID |
AMOUNT |
ORDERDATE |
422 |
JOPO |
9 |
392 |
2014/1/1 |
424 |
AYWYN |
13 |
25800 |
2014/1/4 |
428 |
SAVEA |
8 |
11600 |
2014/1/9 |
429 |
PJIPE |
14 |
29400 |
2014/1/5 |
430 |
PJIPE |
10 |
7742 |
2014/1/12 |
… |
… |
… |
… |
… |
需要分别从两个数据库的 sales 表中取当年第 35 个星期的数据,合并结果,结果如下:
ORDERID |
CLIENT |
SELLERID |
AMOUNT |
ORDERDATE |
294 |
YZ |
9 |
24400 |
2013/8/27 |
295 |
PJIPE |
16 |
12200 |
2013/8/27 |
296 |
PJIPE |
2 |
7448 |
2013/8/27 |
298 |
AVU |
2 |
9604 |
2013/8/27 |
299 |
UJRNP |
4 |
5586 |
2013/9/1 |
300 |
HANAR |
17 |
2842 |
2013/8/26 |
302 |
AYWYN |
6 |
4214 |
2013/9/1 |
303 |
JOPO |
6 |
26800 |
2013/8/31 |
659 |
JAXE |
20 |
23900 |
2014/8/27 |
660 |
QHHW |
5 |
13500 |
2014/8/29 |
662 |
JOPO |
17 |
9114 |
2014/8/31 |
664 |
SJCH |
1 |
27400 |
2014/8/28 |
665 |
UJRNP |
15 |
13400 |
2014/8/27 |
669 |
JAXE |
20 |
28800 |
2014/8/31 |
670 |
JAYB |
17 |
19300 |
2014/8/31 |
解法及简要说明
在集算器中编写脚本 p1.dfx,如下所示:
A |
|
1 |
>sql="SELECT * FROM sales WHERE WEEKOFYEAR(orderdate) = 35" |
2 |
>dbname=["oracle","mysql"] |
3 |
>dbtype=["ORACLE","MYSQL"] |
4 |
=dbname.(connect@l(~)) |
5 |
=dbtype.(sql.sqltranslate(~)) |
6 |
=A4.conj(~.query@x(A5(#))) |
简要说明:
A1 需要执行的标准 SQL
A2 多个数据源名称
A3 对应多个数据源名称的多个数据库类型
A4 连接各数据库
A5 将标准 SQL 中的函数翻译成指定数据库中的格式
A6 合并多个数据库中执行对应 SQL 后返回的结果
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
https://stackoverflow.com/questions/63414325/virtual-federated-sql-database
应该用简单 SQL
英文版