30天學會Data Integration - Kettle系列 第 18 篇 - Step - 資料庫Join

 此篇要來介紹如何Join Table,使用的Step是[Lookup]Database Join,會以MSSQL的Northwind資料庫來示範。

[Lookup]Database Join介紹

此Step允許加入參數(前一個步驟的欄位值)來進行資料庫查詢,在SQL語法中使用?來表示參數的位置,可以有多個?號,而?號出現的順序 = 參數在Step中定義的順序。

本篇目標

取得每位員工所負責的訂單(含客戶與貨運商資料),總共四張Table,需要Join三次

Northwind資料庫圖表





設定資料庫連線

在「Step - 讀取資料庫」篇中有說明如何設定Step中的連線,另外一種設定方式是直接在View頁籤中設定連線



設定方式與「Step - 讀取資料庫」篇一樣



取得員工資料

新增、設定與預覽 Table Input,在「Step - 讀取資料庫」篇中也說過囉!快速帶過



預覽資料



取得員工負責的訂單

新增與設定Database Join,請在Step name輸入名稱,以避免後續混淆;SQL的地方,因為我們要取得每個員工所負責的訂單,所以要開始來進行訂單資料的join,join的條件:訂單的EmployeeID = 員工的EmployeeID,所以需要在下方的Parameter的地方,定義上一個步驟「讀取員工資料」的EmployeeID來做為比對的值



預覽,成功取得員工所負責的訂單資料,其中EmployeeID_1欄位是什麼意思呢?因為Employees與Orders資料表都有一個叫做EmployeeID的欄位,因為在Transformation中欄位是不可以重複的,所以這邊自動將Orders的EmployeeID欄位改以EmployeeID_1來定義



取得訂單的客戶資料

新增與設定Database Join,請在Step name輸入名稱,以避免後續混淆;SQL的地方,因為我們要取得該訂單的客戶資料,所以要開始來進行客戶的資料join,join的條件:客戶的CustomerID = 訂單的CustomerID,所以需要在下方的Parameter的地方,定義上一個步驟「取得員工負責的訂單」的CustomerID來做為比對的值



預覽資料



取得訂單的貨運商

新增與設定Database Join,請在Step name輸入名稱,以避免後續混淆;SQL的地方,因為我們要取得該訂單的貨運商資料,所以要開始來進行貨運商的資料join,join的條件:貨運商的ShipperID = 訂單的ShipVia,所以需要在下方的Parameter的地方,定義上一個步驟「取得員工負責的訂單」的ShipVia來做為比對的值



預覽資料,此時的欄位已經已經多到很難查看了,下方的橫向卷軸越來越寬XD,其實可以在下SQL時就指定欄位,或是使用[Transform]Select Values中的Select and Alter頁籤來設定要顯示的欄位,詳細可複習這一篇Step - 字串組合與欄位調整




完成上述動作之後想必大家一定對於Database Join的設定很熟悉了,但可能會有個疑問,就是為什麼要這麼麻煩啊...!為什麼不在第一個Step(取得員工資料)使用Table Input時就直接一次下完join的SQL呢?

SELECT * FROM [Employees] AS [t0]
INNER JOIN [Orders] AS [t1] ON ([t0].[EmployeeID]) = [t1].[EmployeeID]
INNER JOIN [Customers] AS [t2] ON [t1].[CustomerID] = [t2].[CustomerID]
INNER JOIN [Shippers] AS [t3] ON [t1].[ShipVia]  = ([t3].[ShipperID])

答案是,如果所有資料表都在同一個資料庫,就可以在Table Input時一次下完join,但是如果資料表是屬於不同的資料庫,就只好乖乖使用Database Join囉(記得更改Connection即可)!

下一篇會繼續介紹別的Join方式

參考資料:https://northwinddatabase.codeplex.com/

留言

這個網誌中的熱門文章

CPE 一顆星選集題目說明與解答 - Java 筆記與心得分享

Visual Studio 自動排版格式化程式碼

1. Vito's family (CPE10406, UVA10041) - CPE一顆星解答與說明