一条 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