便利な使い方
SQLのアクションで前のクエリの結果を使用する

SQLのアクションで前のクエリの結果を使用する

ベースマキナのSQL系のデータソース(MySQL、PostgreSQL)では、複数のクエリを登録して順番に実行できます。

この機能を使う際に、前のクエリの結果を次のクエリで使用できます。

ここでは、次のように指定のメールアドレスのユーザー情報を取得してから、取得したユーザーIDを使用してユーザーの決済情報を無効化するクエリを実行する例を紹介します。

-- 指定したメールアドレスのユーザーIDを取得する
SELECT id FROM users WHERE email = {{ email }} LIMIT 1;
 
-- 取得したユーザーIDを使用してユーザーの決済情報を無効化する
DELETE FROM payment_settings WHERE user_id = (取得したユーザーID);

変数を利用する方法(MySQLのみ)

変数を定義して、取得したユーザーIDを格納し、その変数を次のクエリで使用する方法です。

まず最初のクエリで変数を定義します。

SET @userId = '';

次に、指定のメールアドレスのユーザー情報を取得して、取得したユーザーIDを変数に格納します。

SELECT id INTO @userId FROM users WHERE email = {{ email }} LIMIT 1;

最後に、取得したユーザーIDを使用してユーザーの決済情報を無効化するクエリを実行します。

このクエリだけ「書き込み」の種類のクエリとして登録します。

DELETE FROM payment_settings WHERE user_id = @userId;

以上のように、@を付けた変数を定義することで、前のクエリの結果を次のクエリで使用できます。

最終的な設定は次の画像のようになります。

変数を使って前のクエリの結果を使用する

なお、ベースマキナのSQL系のアクションは、複数のクエリを登録していても1つのセッション内で処理されます。

したがって一度変数に格納した値は、後続のクエリのいずれでも使用できます。

一時テーブルを使う方法(MySQL / PostgreSQL)

一時テーブルを定義して、取得したユーザーIDを格納し、その一時テーブルのレコードを次のクエリで使用する方法です。

指定のメールアドレスのユーザー情報を取得して、取得したユーザーIDを一時テーブルに格納します。

CREATE TEMPORARY TABLE temp_user AS SELECT id FROM users WHERE email = {{ email }} LIMIT 1;

そして、取得したユーザーIDを使用してユーザーの決済情報を無効化するクエリを実行します。

このクエリだけ「書き込み」の種類のクエリとして登録します。

DELETE FROM payment_settings WHERE user_id = (SELECT id FROM temp_user);

以上のように、CREATE TEMPORARY TABLEを使って一時テーブルを定義することで、前のクエリの結果を次のクエリで使用できます。

最終的な設定は次の画像のようになります。

一時テーブルを使って前のクエリの結果を使用する

なお、ベースマキナのSQL系のアクションは、複数のクエリを登録していても1つのセッション内で処理されます。

したがって一時テーブルに格納した値は、後続のクエリのいずれでも使用できます。

一時テーブルはセッションが終了すると自動的に削除されます。