既存データテーブルの一部のレコードを差分更新することはできますか?
既存データテーブルの一部のレコードを差分更新したい場合は、次の手順を参考に更新用のジョブフローを設定してください。
差分更新の設定手順サンプル
以下のようなケースを想定し、差分更新の設定手順例を説明します。
- 想定ケース
- 差分データが格納されたcsvファイルがストレージに日次で設置される
- それをジョブフローで取り込み、データテーブル内のマスタテーブルを差分更新する
1. 「マスタテーブル」と「tempテーブル」を作成
- 最新のデータを管理するための「マスタテーブル」を作成します
- 「マスタテーブル」とは別に、差分データを一時的に格納するための「tempテーブル」を作成します
2. 「マスタテーブル」と「tempテーブル」をJOINするデータ更新用クエリを作成
- 以下を満たすクエリを作成します
- 「マスタテーブル」の更新対象レコードを消し込み
- 「tempテーブル」のレコードをUNION
- クエリのサンプルは後述
3. ジョブフローを作成
- 以下のジョブを含むジョブフローを作成します
- ジョブ1: 「tempテーブル更新用」
- ストレージ上のcsvファイルの内容を使って、「tempテーブル」を「置き換え」で更新する
- ジョブ2: 「マスタテーブル更新用」
- 2で作成したクエリの結果を使って、「マスタテーブル」を「置き換え」で更新する
- ジョブ1: 「tempテーブル更新用」
差分更新クエリサンプル
上記の手順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
Updated 12 months ago