ディメンションテーブルは常に変化しています。 したがって、レコードをディメンションテーブルに結合するときは、レコードがディメンションテーブルのスナップショットに関連付けられる時間を指定する必要があります。 現在、レコードは、現時点で取得されたディメンションテーブルのスナップショットにのみ関連付けることができます。 (将来的には、左側のテーブルの rowtime で指定した時間に取得されたディメンションテーブルのスナップショットにレコードを関連付けることができるようになります。)

ディメンションテーブルの JOIN 構文

SELECT column-names
FROM table1  [AS <alias1>]
[LEFT] JOIN table2 FOR SYSTEM_TIME AS OF PROCTIME() [AS <alias2>]
ON table1.column-name1 = table2.key-name1

たとえば、次の SQL 文は、イベントストリームをホワイトリストのディメンションテーブルに結合します。

SELECT e.*, w. *
FROM event AS e
JOIN white_list FOR SYSTEM_TIME AS OF PROCTIME() AS w
ON e.id = w.id
  • ディメンションテーブルは、INNER JOINLEFT JOINをサポートし、RIGHT JOINFULL JOIN はサポートしていません。
  • ディメンションテーブルの最後に、FOR SYSTEM_TIME AS OF PROCTIME() を付ける必要があります。 そうすると、現時点で表示できるディメンションテーブルのデータが結合されます。
  • JOIN 操作は処理時間中にのみ実行されます。 したがって、ディメンションテーブルにデータが追加、更新、または削除されても、関連付けられたデータが取り消されたり変更されることはありません。
  • ON 条件には、ディメンションテーブルの主キーと同等の条件が含まれている必要があります (実際に参照されるテーブルの定義と一致している必要があります)。 必要な同等の条件に加えて、ON 条件には他の同等の条件を含めることができます。
  • 2 つのディメンションテーブルを結合することはできません。

  • テストデータ

    nameinfo:

    id (BIGINT) name (VARCHAR) age (BIGINT)
    1 lilei 22
    2 hanmeimei 20
    3 libai 28

    phoneNumber:

    name (VARCHAR) phoneNumber (BIGINT)
    dufu 18867889855
    baijuyi 18867889856
    libai 18867889857
    lilei 18867889858
  • テスト文
    CREATE TABLE datahub_input1 (
    id            BIGINT,
    name        VARCHAR,
    age           BIGINT
    ) WITH (
    type='datahub'
    );
    
    create table phoneNumber(
    name VARCHAR,
    phoneNumber bigint,
    primary key(name),
    PERIOD FOR SYSTEM_TIME
    )with(
    type='rds'
    );
    
    CREATE table result_infor(
    id bigint,
    phoneNumber bigint,
    name VARCHAR
    )with(
    type='rds'
    );
    
    INSERT INTO result_infor
    SELECT
    t.id,
    w.phoneNumber,
    t.name
    FROM datahub_input1 as t
    JOIN phoneNumber FOR SYSTEM_TIME AS OF PROCTIME() as w
    ON t.name = w.name;
    
  • テスト結果
    id (BIGINT) phoneNumber (BIGINT) name (VARCHAR)
    1 18867889858 lilei
    3 18867889857 libai