web-dev-qa-db-ja.com

2つの別個のデータベースからの結果の結合

2つの個別のpostgresデータベースからJOIN行することは可能ですか?

私は1つのサーバーにいくつかのデータベースがあるシステムで作業しており、時々そのような機能が本当に必要です。

51
sennin

http://wiki.postgresql.org/wiki/FAQ によると

現在のデータベース以外のデータベースを照会する方法はありません。 PostgreSQLはデータベース固有のシステムカタログをロードするため、クロスデータベースクエリがどのように動作するかは不確かです。 contrib/dblinkは、関数呼び出しを使用したデータベース間のクエリを許可します。もちろん、クライアントは異なるデータベースに同時に接続して、クライアント側で結果をマージすることもできます。

[〜#〜] edit [〜#〜]:3年後(2014年3月)、これはFAQエントリ改訂され、より便利になりました。

複数のデータベースを使用してクエリを実行するにはどうすればよいですか?

現在のデータベース以外のデータベースを直接照会する方法はありません。 PostgreSQLはデータベース固有のシステムカタログをロードするため、クロスデータベースクエリがどのように動作するかは不確かです。

PostgreSQLのSQL/MEDサポートにより、「外部データラッパー」を作成し、リモートデータベースのテーブルをローカルデータベースにリンクできます。リモートデータベースは、同じPostgreSQLインスタンス上の別のデータベースでも、世界中の半分のデータベースでも構いません。 postgres_fdwはPostgreSQL 9.3に組み込まれており、読み取り/書き込みサポートが含まれています。 9.2の読み取り専用バージョンは、contribモジュールとしてコンパイルおよびインストールできます。

contrib/dblinkは、関数呼び出しを使用したデータベース間のクエリを許可し、はるかに古いPostgreSQLバージョンで使用できます。 postgres_fdwとは異なり、リモートサーバーに条件を「プッシュダウン」することはできないため、必要以上に多くのデータを取得することがよくあります。

もちろん、クライアントは異なるデータベースに同時に接続して、クライアント側で結果をマージすることもできます。

53
ndtreviv

Dblinkを忘れてください!

Postgres_FDW に挨拶してください:

postgres_fdwを使用してリモートアクセスを準備するには:

  1. postgres_fdwを使用してCREATE EXTENSION拡張機能をインストールします。

  2. CREATE SERVERを使用して、接続する各リモートデータベースを表す外部サーバーオブジェクトを作成します。サーバーオブジェクトのオプションとして、ユーザーとパスワードを除く接続情報を指定します。

  3. 各外部サーバーへのアクセスを許可するデータベースユーザーごとに、CREATE USER MAPPINGを使用してユーザーマッピングを作成します。ユーザーマッピングのユーザーおよびパスワードオプションとして使用するリモートユーザー名とパスワードを指定します。

  4. アクセスするリモートテーブルごとに、CREATE FOREIGN TABLEまたはIMPORT FOREIGN SCHEMAを使用して外部テーブルを作成します。外部テーブルの列は、参照されるリモートテーブルと一致する必要があります。ただし、外部テーブルオブジェクトのオプションとして正しいリモート名を指定した場合は、リモートテーブルとは異なるテーブル名や列名を使用できます。

これで、外部テーブルのSELECTだけで、その基になるリモートテーブルに格納されているデータにアクセスできます。

大規模なデータでも非常に便利です。

27
Luiz Vaz

はい、パフォーマンスを大幅に考慮しながら、dblinkを使用してこれを行うことができます。

次の例では、現在のSQLユーザーに両方のデータベースに対する権限が必要です。 db2が同じクラスターにない場合は、dbname=db2dblink documentation で定義されている完全な接続文字列に置き換える必要があります。

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

table2が非常に大きい場合、サブクエリは結合を実行する前にtable2全体をロードするため、パフォーマンスの問題が発生する可能性があります。

7
Elliot B.

いいえ、できません。 dblink を使用して、あるデータベースから別のデータベースに接続できますが、JOINを探している場合は役に立ちません。

単一のデータベース内で異なるスキーマを使用してすべてのデータを保存することはできませんか?

6
Frank Heikens

上記のaraqnidのように、dblink ...を使用する必要があります。次のようにうまく機能します。

sT.Table_Name、ST.Column_Name、DV.Table_Name、DV.Column_Name、*をinformation_schema.Columnsから選択ST完全外部結合dblink( 'dbname = otherdatabase'、 'select Table_Name、Column_Name from information_schema.Columns')DV(Table_Name text、 ST.Table_Name = DV.Table_nameおよびST.Column_Name = DV.Column_NameのColumn_Nameテキスト)。ST.Column_NameはnullまたはDV.Column_NameはNULLです。

4
kenyee

ほんの数ステップで目標を達成できます: この参照ステップの後にstep

WE HAVE BEEN CONNECTED TO DB2 WITH TABLE TBL2 AND COLUMN COL2
ALSO THERE IS DB1 WITH TBL1 AND COLUMN COL1

 *** connecting to second db ie db2
    Now just **copy paste the 1-7 processes** (make sure u use correct username and password and ofcourse db name)

    1.**CREATE EXTENSION dblink;**

    2.**SELECT pg_namespace.nspname, pg_proc.proname 
    FROM pg_proc, pg_namespace 
    WHERE pg_proc.pronamespace=pg_namespace.oid 
       AND pg_proc.proname LIKE '%dblink%';**

    3.**SELECT dblink_connect('Host=localhost user=postgres password=postgres dbname=db1');**

    4.**CREATE FOREIGN DATA WRAPPER postgres VALIDATOR postgresql_fdw_validator;**

    5.**CREATE SERVER postgres2 FOREIGN DATA WRAPPER postgres OPTIONS (hostaddr '127.0.0.1', dbname 'db1');**

    6.**CREATE USER MAPPING FOR postgres SERVER postgres2 OPTIONS (user 'postgres', password 'postgres');**

    7.**SELECT dblink_connect('postgres2');**

    ---Now, you can SELECT the data of Database_One from Database_Two and even join both db results:

    **SELECT * FROM public.dblink
    ('postgres2','SELECT col1,um_name FROM public.tbl1 ') 
    AS DATA(um_userid INTEGER),tbl2 where DATA.col1=tbl2.col2;**


You can also Check this :[How to join two tables of different databases together in postgresql [\[working finely in version 9.4\]][1]
2
Ipsita Upadhyay

Postgresqlのdblink拡張機能を使用しています。

この記事からの参照:

1つのデータベースを別のデータベースに接続するために使用されるPostgreSQLのDbLink拡張。

DbLink拡張機能をインストールします。

CREATE EXTENSION dblink;

DbLinkの検証:

SELECT pg_namespace.nspname, pg_proc.proname 
FROM pg_proc, pg_namespace 
WHERE pg_proc.pronamespace=pg_namespace.oid 
   AND pg_proc.proname LIKE '%dblink%';

これについては既に完全なデモンストレーションを準備しています。 Postgresqlでクロスデータベースクエリを実行するためのステップバイステップを学ぶために私の投稿をご覧ください。

2
Anvesh