既存データテーブルの一部のレコードを差分更新することはできますか?

既存データテーブルの一部のレコードを差分更新したい場合は、次の手順を参考に更新用のジョブフローを設定してください。

差分更新の設定手順サンプル

以下のようなケースを想定し、差分更新の設定手順例を説明します。

  • 想定ケース
    • 差分データが格納された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