2つの個別のpostgresデータベースからJOIN
行することは可能ですか?
私は1つのサーバーにいくつかのデータベースがあるシステムで作業しており、時々そのような機能が本当に必要です。
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とは異なり、リモートサーバーに条件を「プッシュダウン」することはできないため、必要以上に多くのデータを取得することがよくあります。
もちろん、クライアントは異なるデータベースに同時に接続して、クライアント側で結果をマージすることもできます。
Dblinkを忘れてください!
Postgres_FDW に挨拶してください:
postgres_fdw
を使用してリモートアクセスを準備するには:
postgres_fdw
を使用してCREATE EXTENSION
拡張機能をインストールします。
CREATE SERVER
を使用して、接続する各リモートデータベースを表す外部サーバーオブジェクトを作成します。サーバーオブジェクトのオプションとして、ユーザーとパスワードを除く接続情報を指定します。各外部サーバーへのアクセスを許可するデータベースユーザーごとに、
CREATE USER MAPPING
を使用してユーザーマッピングを作成します。ユーザーマッピングのユーザーおよびパスワードオプションとして使用するリモートユーザー名とパスワードを指定します。アクセスするリモートテーブルごとに、
CREATE FOREIGN TABLE
またはIMPORT FOREIGN SCHEMA
を使用して外部テーブルを作成します。外部テーブルの列は、参照されるリモートテーブルと一致する必要があります。ただし、外部テーブルオブジェクトのオプションとして正しいリモート名を指定した場合は、リモートテーブルとは異なるテーブル名や列名を使用できます。これで、外部テーブルの
SELECT
だけで、その基になるリモートテーブルに格納されているデータにアクセスできます。
大規模なデータでも非常に便利です。
はい、パフォーマンスを大幅に考慮しながら、dblink
を使用してこれを行うことができます。
次の例では、現在のSQLユーザーに両方のデータベースに対する権限が必要です。 db2
が同じクラスターにない場合は、dbname=db2
を dblink 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
全体をロードするため、パフォーマンスの問題が発生する可能性があります。
いいえ、できません。 dblink を使用して、あるデータベースから別のデータベースに接続できますが、JOINを探している場合は役に立ちません。
単一のデータベース内で異なるスキーマを使用してすべてのデータを保存することはできませんか?
上記の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です。
ほんの数ステップで目標を達成できます: この参照ステップの後に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]
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でクロスデータベースクエリを実行するためのステップバイステップを学ぶために私の投稿をご覧ください。