跳到主要內容 跳至補充內容

新增 SQL 轉換

您可以在轉換任務中納入基於 SQL 的表格。SQL 轉換可讓您在管道中輸入 SQL SELECT 查詢,以定義複雜或簡單的轉換。若執行初始載入或增量載入,您也可以使用巨集以調整要執行的查詢。

如需更多關於建立轉換任務的資訊,請參閱 轉換資料

新增 SQL 轉換

若要在轉換資料任務中新增 SQL 轉換:

  1. 轉換中,選取要在查詢中包含的資料集,再按一下新增 SQL 轉換

    會顯示新增 SQL 轉換,您可在此提供轉換設定。

  2. 名稱中輸入目標資料集的名稱。

    您也可以在說明中新增較長的說明。

  3. 具體化中,選取是否應具體化轉換的輸出。您可以選擇繼承資料任務設定中的設定。

    • 開啟將會建立表格,並且將會處理相關的 ELT 處理。

    • 關閉將會建立即時執行轉換的檢視。

  4. 增量載入可讓您套用篩選條件或其他條件,以減少使用巨集處理的資料集,藉此調整對於增量資料載入的查詢。只有在資料具體化為表格時,才能使用增量載入

    • 增量載入開啟

      首次執行任務將會執行初始載入,將所有查詢結果插入目標表格中。後續執行將會執行增量載入,運用您為增量處理定義的篩選條件或特定條件。在增量載入期間,任務只會以更新或插入方式處理資料,不會管理刪除。

    • 增量載入關閉

      首次執行任務將會執行初始載入,將所有查詢結果插入目標表格中。後續執行將會與目標表格比較,並處理新的、已變更或已刪除的記錄,以處理所有查詢結果。

    資訊備註若查詢將會選取應存在於目標中的所有記錄,請將增量載入設定為關閉。將會在目標中刪除未選取的記錄。
  5. 在您準備好建立 SQL 轉換時按一下新增

    就會顯示編輯 SQL 轉換

  6. 輸入查詢以在 SELECT 查詢中傳回基於 SQL 的表格。

    只能從您選取的來源資料集讀取查詢,但您可以透過新增新增更多來源資料集。

    可從資料集選取。

  7. 若使用增量載入,則執行初始載入或增量載入時,您可以使用巨集以調整要執行的查詢。

    如需詳細資訊,請參閱使用巨集調整查詢以因應載入類型

  8. 按一下擷取參數以剖析 SELECT 查詢中的參數。

    參數應對應至來源或目標物件。您可以對應至

    • 歷史記錄類型 2 結構 (_history)

    • 目前結構

    • 目標物件

      若在增量巨集內部定義參數,您只能對應目標物件。

    提示備註可用參考取代參數,使查詢更加易讀。變更參數中的值,SELECT 查詢中的參考也會變更。
  9. 按一下描述表格可取得查詢輸出中繼資料的預覽。

    您也可以使用資料樣本預覽結果。

    預覽資料

  10. 確認表格有主要金鑰。

    您也可以編輯中繼資料設定。

    • 金鑰欄中設定主要金鑰。

    • 可為 Null 欄中設定欄是否可為 Null。

    • 選取欄並按一下編輯以設定欄名稱、金鑰、可為 Null 和資料類型。

  11. 若您滿意查詢結果,按一下確定。資料集即已新增至目標清單,您可預覽。

預覽資料

您可以使用資料樣本預覽結果。

資訊備註必須在 Qlik 管理主控台 於租用戶層級啟用資料預覽。您可以在特徵控制之下的設定找到檢視 資料整合 中的資料選項。

必須向您指派下列角色,您才能預覽資料:

  • 資料連線所在空間中的可以檢視資料

  • 資料專案所在空間中的可以檢視

若要檢視結果預覽:

  • 按一下檢視資料

就會顯示使用資料樣本的結果。您可以透過列數設定要在樣本中納入多少資料列。

您可以使用兩種方式篩選樣本資料:

  • 使用 篩選 篩選要擷取哪個樣本資料。

    例如,若您使用篩選 ${OrderYear}>2023列數設定為 10,您將取得 2024 年的 10 筆訂單樣本。

  • 依特定欄篩選樣本資料。

    這只會影響現有的樣本資料。若您使用 篩選 僅納入 2024 年的訂單,並設定欄篩選以顯示 2022 年的訂單,則結果是空的樣本。

您可以依特定欄排序資料樣本。排序只會影響現有的樣本資料。若您使用 篩選 僅納入 2024 年的訂單,並反轉排序訂單,則樣本資料仍然只會包含 2024 年的訂單。

使用巨集調整查詢以因應載入類型

若使用增量載入,則執行初始載入或增量載入時,您可以使用巨集以調整要執行的查詢。

選取巨集並在各自的子句內新增查詢。

  • Q_RUN_INCREMENTAL 可新增子句,您可在此置放只有在執行增量載入時才會執行的查詢。

  • Q_RUN_INITIAL_LOAD 可新增子句,您可在此置放只有在執行初始載入時才會執行的查詢。

您不需要對每個巨集指定完整查詢。您可以根據使用案例調整或新增程式碼。

使用案例:使用日期範圍的增量篩選:

在此使用案例中,需要透過自訂 SQL 轉換一組訂單資料。由於這是大型資料集,您想要納入增量篩選,以確保增量載入僅考慮過去 12 小時的訂單。

此為基本查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM “mydb”.”myStorageTask”.”ORDER” O JOIN “mydb”.”myStorageTask”.”ORDER_DETAIL” OD ON O.ORDER_ID = OD.ORDER_ID

此為要在增量執行期間套用的篩選條件,其中您僅考慮過去 12 小時新增的訂單:

WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP())
提示備註實施基於 SQL 的表格時,建議以 ${TABLE} 標記法取代表格名稱。這可避免可能會改變環境 (例如從開發移至生產時) 的寫入程式碼資料庫和結構描述名稱。

此為完整查詢,使用篩選巨集和以 ${TABLE} 標記法取代的表格名稱:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP() ) {{/QLIK_FUNC_IF}}

這會產生初始載入查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID

以及增量載入查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID WHERE OD.UPDATE_DTM > DATEADD(hour, -12, CURRENT_TIMESTAMP() )

使用案例:使用目標中資料的增量篩選:

在此使用案例中,需要透過自訂 SQL 轉換一組訂單資料。由於訂單是大型資料集,您想要納入增量篩選,以確保增量載入僅考慮比目標表格中的資料更新的訂單詳細記錄。您也想要標記列是經由初始載入或增量載入來處理。

資訊備註如同此範例所示,巨集可用來調整初始載入或增量載入的任何查詢部分。

此為基本查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT , OD.LAST_UPDATE_DTM FROM “mydb”.”myStorageTask”.”ORDER” O JOIN “mydb”.”myStorageTask”.”ORDER_DETAIL” OD ON O.ORDER_ID = OD.ORDER_ID

此為要在增量執行期間套用的篩選。“ORDERS_DERIVED” 是目標資料集的名稱。

WHERE OD.UPDATE_DTM > = (SELECT MAX(LAST_UPDATE_DTM) FROM “mydb”,”myTrasformTask”.”ORDERS_DERIVED” )
提示備註增量載入也可以將 ${TABLE} 標記法對應至透過轉換任務建立的目標物件。

此為完整查詢,使用篩選巨集和以 ${TABLE} 標記法取代的表格名稱。若為初始載入,則 LOADED_BY 設定為 INIT,若為增量載入,則設定為 INCR

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, {{#QLIK_FUNC_IF Q_RUN_INITIAL_LOAD}} ‘INIT’ as LOADED_BY {{/QLIK_FUNC_IF}} {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} ‘INCR’ as LOADED_BY {{/QLIK_FUNC_IF}} FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID {{#QLIK_FUNC_IF Q_RUN_INCREMENTAL}} WHERE OD.UPDATE_DTM >= (SELECT MAX(LAST_UPDATE_DTM) FROM ${TARGET_TABLE} ) {{/QLIK_FUNC_IF}}

這會產生初始載入查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, ‘INIT’ as LOADED_BY FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID

以及增量載入查詢:

SELECT O.ORDER_ID, O.CUSTOMER_ID, OD.PRODUCT_ID, OD.QUANTITY, O.AMOUNT, OD.LAST_UPDATE_DTM, ‘INCR’ as LOADED_BY FROM ${ORDER} O JOIN ${ORDER_DETAIL} OD ON O.ORDER_ID = OD.ORDER_ID WHERE OD.UPDATE_DTM >= (SELECT MAX(LAST_UPDATE_DTM) FROM ${TARGET_TABLE} )

最佳做法

  • 若新增 SQL 轉換,不會自動定義主要金鑰。在資料集索引標籤中,新增金鑰到資料集。

  • 請勿手動在轉換的輸出中建立欄標頭。

  • 避免使用 SELECT 搭配 *,因為這可能會在每次查詢執行時傳回不同的欄。若結構描述中有變更,請據此變更查詢並重新執行描述表格。然後您可以編輯欄並調整表格。

此頁面是否對您有幫助?

若您發現此頁面或其內容有任何問題——錯字、遺漏步驟或技術錯誤——請告知我們可以如何改善!