既存データテーブルの一部のレコードを差分更新したい場合は、次の手順を参考に更新用のジョブフローを設定してください。
差分更新の設定手順サンプル
以下のようなケースを想定し、差分更新の設定手順例を説明します。
想定ケース
差分データが格納されたcsvファイルがストレージに日次で設置される
それをジョブフローで取り込み、データテーブル内のマスタテーブルを差分更新する
1. 「マスタテーブル」と「tempテーブル」を作成
最新のデータを管理するための「マスタテーブル」を作成します
「マスタテーブル」とは別に、差分データを一時的に格納するための「tempテーブル」を作成します
2. 「マスタテーブル」と「tempテーブル」をJOINするデータ更新用クエリを作成
以下を満たすクエリを作成します
「マスタテーブル」の更新対象レコードを消し込み
「tempテーブル」のレコードをUNION
クエリのサンプルは後述
3. ジョブフローを作成
以下のジョブを含むジョブフローを作成します
ジョブ1: 「tempテーブル更新用」
ストレージ上のcsvファイルの内容を使って、「tempテーブル」を「置き換え」で更新する
ジョブ2: 「マスタテーブル更新用」
2で作成したクエリの結果を使って、「マスタテーブル」を「置き換え」で更新する
差分更新クエリサンプル
上記の手順2で使用するクエリのサンプルです。
前提
商品マスタを差分更新するためのクエリサンプルです
ストレージ上のcsvファイルに含まれるカラムは下記です
item_id(主キー)
name
image
url
更新日を後から追いやすくするために、クエリ内でupdated_atというカラムを追加しています
注意点
使用する場合は、テーブル名やカラム名を実際のものに書き換えてください
WITH current_master AS ( -- 既存マスタデータ
SELECT
item_id -- 以下、実際のカラム名を指定してください
, ANY_VALUE(name) AS name -- 以下、万が一重複レコードが混入したケースを考慮
, ANY_VALUE(image) AS image
, ANY_VALUE(url) AS url
, ANY_VALUE(updated_at) AS updated_at
FROM `prd-karte-per-client.master_dataset.item_master` -- 実際のマスタテーブル名を指定してください
WHERE NOT item_id IS NULL
GROUP BY item_id
)
, new_data AS ( -- 変更対象のレコード
SELECT
item_id -- 以下、実際のカラム名を指定してください
, name
, image
, url
, CURRENT_TIMESTAMP() AS updated_at
FROM `prd-karte-per-client.master_dataset.item_master_temp` -- 実際の一時テーブル名を指定してください
WHERE NOT item_id IS NULL
)
, non_updated_master AS ( -- 変更対象ではない既存マスタデータのレコード
SELECT
a.item_id -- 以下、実際のカラム名を指定してください
, a.name
, a.image
, a.url
, a.updated_at
FROM current_master AS a
LEFT OUTER JOIN new_data AS b
ON a.item_id = b.item_id
WHERE b.item_id IS NULL
)
SELECT * FROM non_updated_master
UNION DISTINCT
SELECT * FROM new_data