BIRT 異構跨庫的動態關聯查詢怎麼做
BIRT自帶的Data Sources Join以及用ETL轉化為同庫等方案都難以解決此類問題。具體可以透過如下示例討論:
交易明細資料(trade表)儲存於生產系統的資料庫DB2中,另外一部分業務資料(network表、account表)儲存於業務系統的Mysql中,它們其中的關聯關係如下圖所示:
所謂“動態關聯”,是指使用者在前臺介面輸入引數,報表透過引數來決定trade和哪張表做關聯,並在報表中顯示關聯後的資料,實際運算中可能還要進行資料過濾和彙總。查詢流程如下圖所示:
比如查詢場景一:報表根據傳入引數,能動態地將trade中的outAccount欄位和account中的accountNo欄位關聯,最後查詢結果顯示trade中的所有欄位以及account的name,gender,city等欄位。
解決此類問題的常見方案與不足,分析如下:
1、BIRT Data Sources Join的問題在於要求表名和欄位名是已知、確定的,但這類報表都是透過引數來動態關聯的,因此無法實現。
2、可以用ETL把生產庫的資料抽取到業務庫,這樣跨庫的問題就轉化為同庫了。這個方案思路簡單但實施起來細節上有很多難點。首先是實時查詢:為了實時查詢資料,需要在生產庫使用觸發器之類的功能來檢測資料的實時變化,並將資料推送到業務庫,但生產庫不能輕易改動,因此實時查詢就無法實現。非實時查詢也難以辦到,這是因為生產庫的資料極其龐大,不可能每次都全部取過來,只有用增量抽取的辦法,而判斷增量就需要在trade表中加入時間戳欄位。同樣,生產庫是不允許有這種改動的,因此也無法實現。
3、從能力上講,BIRT JAVA bean data source是真正能解決報表問題,它比Data Sources Join更具靈活性,也不需要修改生產庫。但這個方案只有一個缺陷:程式碼過於複雜,原因在於資料計算並非JAVA特長,若每次遇到跨庫問題都用硬編碼方式來實現,並不現實。
建議使用集算器,它是獨立的資料計算引擎,擁有不依賴於資料庫的計算能力,支援異構資料來源的混合運算,比較適合進行動態關聯再計算,事實上,可以把集算器看作是語法更簡單的BIRT JAVA bean data source。比如實現上面的問題,集算器指令碼只需6行:
|
A |
1 |
=DB2.query("select runningNo,networkNo,outAccount,amount from trade") |
2 |
="select"+crossJoinField+","+crossOtherFields+"from"+crossTable |
3 |
=Mysql.query(A2) |
4 |
=join(A1:trade,${tradeJoinField};A3:cross,${crossJoinField}) |
5 |
=crossOtherFields.array().("cross."+~).string() |
6 |
=A4.new(trade.runningNo,trade.networkNo,trade.outAccount,trade.amount,${A5}) |
其中 tradeJoinField,crossJoinField,crossOtherFields,crossTable 為輸入引數。最後將計算結果返回給BIRT的DataSet進行報表展現。從此示例來看,集算器的引數用法很靈活,非常適合這類動態關聯查詢。由於它是專門的計算語言,所以較於常規辦法,跨庫計算的程式碼更加精煉易懂。
其實還有很多類似的跨庫、分庫計算問題,若有集算器SPL的輔助會很簡單,感興趣可以參考:
集算器提供了JDBC驅動,可以很方便的與BIRT等報表工具整合, 有使用和獲得它的方法。
關於集算器安裝使用、獲得免費授權和相關技術資料,可以參見 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2699077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- BIRT 中文字與 JSON 關聯怎麼做JSON
- 多個異構資料庫如何關聯查詢資料庫
- MySQL中跨庫查詢怎麼搞?MySql
- MyBatisPlus怎麼多表關聯查詢?MyBatis
- 如何做多表關聯查詢
- Laravel 通過子查詢建立動態關聯Laravel
- jpa動態查詢與多表聯合查詢
- onethinkphp 如何做多表關聯查詢PHP
- 20240719資料庫關聯查詢、條件查詢資料庫
- Specifications 構建動態查詢
- 報表怎麼做模糊查詢
- java 分庫關聯查詢工具類Java
- Yii2實現跨mysql資料庫關聯查詢排序功能MySql資料庫排序
- T-SQL——關於跨庫連線查詢SQL
- ORM 跨庫關聯ORM
- 區分關聯子查詢和非關聯子查詢
- Python—Django:關於在Django框架中對資料庫的查詢函式,查詢集和關聯查詢PythonDjango框架資料庫函式
- 如何完成複雜查詢的動態構建?
- day95:flask:SQLAlchemy資料庫查詢進階&關聯查詢FlaskSQL資料庫
- 在 Laravel 中使用子查詢來構建動態模型關係Laravel模型
- SQL Server 跨資料庫查詢SQLServer資料庫
- BIRT 中組內跨行計算和小計怎麼做
- JPA多表關聯查詢
- Mongodb 關聯表查詢MongoDB
- 防止賬號關聯,該怎麼做?
- mysql中的多表關聯查詢MySql
- laravel 模型關聯查詢的 belongsToManyLaravel模型
- 讀 CSV/TXT 的報表怎麼做分頁查詢?
- Spring Boot中使用JPA構建動態查詢Spring Boot
- mysql三表關聯查詢MySql
- mysql 三表關聯查詢MySql
- win10電腦自動關機日誌怎麼查詢Win10
- 解析MSSQL跨資料庫查詢的實現方法SQL資料庫
- BIRT 如何配置動態資料來源
- BIRT 統計圖中怎麼根據引數實現 X 軸動態分組
- mysql三張表關聯查詢MySql
- 兩表關聯查詢:sql、mybatisSQLMyBatis
- hyperf關聯模型條件查詢模型