同じ SQL クエリで複数のデータベースと環境を問い合わせるには?

同じクエリで、他のプロジェクトや環境のテーブルを問い合わせられ、PostgreSQL と MySQL のあいだでも使えます。サーバーに DB Link を置く必要はありません。

2 つのデータベースのデータを突き合わせる、あるいはタブがステージングのまま本番のテーブルを見る、ということは、たいていエディターから出ることになります。多くの SQL クライアントでは、CSV の書き出し、別スクリプト、サーバー上の DB Link になります。

DB Link はサーバー側の追加設定と権限が要り、PostgreSQL と MySQL のようにエンジンが違うと失敗しやすくなります。

Kerry Studio では、同じクエリの中で、もう一方の接続のテーブルを参照できます。プロジェクトに SQL エイリアスを付け、リモートテーブルを @プロジェクト.テーブル、たとえば @billing.orders と書きます。

実行すると、Kerry は対応する保存済み接続から行を取り、タブの接続上の一時テーブルに置きます。JOIN はそこで走ります。DB Link もサーバーへのインストールも不要です。PostgreSQL と MySQL のあいだでも同じ書き方です。

データの突き合わせはエディターの中で終わり、クエリを離れません。

エイリアスを定義するには

エイリアスはプロジェクトの SQL エイリアス(@alias) 欄にあります。この名前がないと、エディターはトークンを解決できません。

開いた workspace、欄が埋まっているプロジェクト、SQL タブが必要です。

  1. 新しいプロジェクト または プロジェクトを編集 のダイアログで、エイリアスを入れます。例は billing。欄に @ は書かないでください。@ は SQL の中だけです。
  2. クエリを走らせたいプロジェクトと環境にタブを接続します。
  3. エディターで、リモートテーブルの代わりに @プロジェクト.テーブル と書きます。例は @billing.public.orders。
  4. 実行します。Kerry は行を取り、タブの接続上に一時テーブルを作ります。

パレット(⌘K / CtrlK)→ 新しい接続 は、同じプロジェクトダイアログを開きます。

エイリアスを SQL に書くには

エイリアスの書き方は 2 つあります。

@プロジェクト.テーブル、たとえば @billing.orders は、タブがいる環境を使います。schema があるときは、エンジンのパスになります。@billing.public.orders。

@プロジェクト:環境、たとえば @billing:production は、タブが別の環境にいてもその環境を使います。: はエイリアスと環境のあいだだけです。あとは . のままです。@billing:production.public.orders。

schema、テーブル、列は . を使い、: は使いません。正しい例: @billing.public.orders、@billing:production.public.orders。間違い: @billing:production:public.orders。

.テーブル も :環境 もない @名前 だけは、MySQL のユーザー変数です(SET @s)。エイリアスではありません。

@… を決めるのはあなたで、プロジェクト上です。保存済みプロジェクトのあいだでエイリアスは一意でなければなりません。@プロジェクト: のあと、エディターはそのプロジェクトの環境を出します。@プロジェクト:環境. のあと、その接続の schema とテーブルを出します。

エイリアスはタブのプロジェクト選択を切り替えません。行の取り出し先だけを選びます。SQL の名前が保存済みプロジェクトでなければ、エディターがトークンを印し、実行はクエリが求めた名前で失敗します。

同じクエリで 2 つのプロジェクト

よくあるのは、タブが注文のデータベースにいて、顧客が別の保存済みプロジェクトにある場合です。

sql
-- タブは shop プロジェクト、ステージング環境。
-- @shop.public.orders はタブに従います。
-- @crm.public.customers はもう一方のプロジェクトを、タブの環境で取ります。

SELECT
  o.id,
  o.status,
  c.email
FROM @shop.public.orders o
JOIN @crm.public.customers c
  ON c.id = o.customer_id
WHERE o.created_at > current_date - 7;

crm が MySQL でタブが PostgreSQL でも、型は同じです。Kerry が行を取り、JOIN はタブの接続上で走ります。

同じクエリでステージングと本番を突き合わせる

タブがステージングにいて、同じテーブルの本番が欲しいときは、トークンに環境を固定します。

SQL の中タブの環境Kerry の取り出し先
@shop.public.ordersステージングプロジェクト shop のステージング
@shop:production.public.ordersステージングプロジェクト shop の本番
sql
-- タブは shop プロジェクト、ステージング環境。

SELECT
  h.id,
  h.status AS status_staging,
  p.status AS status_production
FROM @shop.public.orders h
JOIN @shop:production.public.orders p
  ON p.id = h.id
WHERE h.status <> p.status;

タブの環境だけを変えるなら、エディターのクエリはそのままで構いません。変わるのは :環境 のないトークンで、タブに従うからです。:production 付きのトークンは、引き続き本番を指します。