Объединение результатов из двух отдельных баз данных - PullRequest
51 голосов
/ 13 января 2011

Можно ли JOIN строк из двух отдельных баз данных postgres?

Я работаю с системой с несколькими базами данных на одном сервере, и иногда мне действительно нужна такая функция.

Ответы [ 7 ]

53 голосов
/ 13 января 2011

Согласно http://wiki.postgresql.org/wiki/FAQ

Нет способа запросить базу данных, отличную от текущей.Поскольку PostgreSQL загружает специфичные для базы данных системные каталоги, неизвестно, как должен вести себя кросс-запрос.contrib / dblink позволяет выполнять запросы между базами данных, используя вызовы функций.Конечно, клиент также может одновременно устанавливать соединения с различными базами данных и объединять результаты на стороне клиента.

РЕДАКТИРОВАТЬ : 3 года спустя (март 2014 г.), эта запись часто задаваемых вопросовбыл переработан и стал более полезным:

Как выполнять запросы с использованием нескольких баз данных?

Нет способа напрямую запросить базу данных, крометекущий.Поскольку PostgreSQL загружает системные каталоги, относящиеся к базе данных, неясно, как должен вести себя кросс-запрос к базе данных.

Поддержка SQL / MED в PostgreSQL позволяет создавать «оболочку внешних данных», связывая таблицы вудаленная база данных в локальной базе данных.Удаленная база данных может быть другой базой данных в том же экземпляре PostgreSQL или базой данных по всему миру, это не имеет значения.postgres_fdw встроен в PostgreSQL 9.3 и включает поддержку чтения / записи;версия только для чтения для 9.2 может быть скомпилирована и установлена ​​как модуль contrib.

contrib / dblink позволяет выполнять запросы к базе данных с использованием вызовов функций и доступна для гораздо более старых версий PostgreSQL.В отличие от postgres_fdw, он не может «протолкнуть» условия на удаленный сервер, поэтому он часто загружает намного больше данных, чем вам нужно.

Конечно, клиент также может одновременно устанавливать соединения с различнымибазы данных и объединить результаты на стороне клиента.

27 голосов
/ 28 апреля 2016

Забудьте о 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 из внешней таблицы для доступа к данным, хранящимся в ее базовой удаленной таблице.

Это действительно полезно даже для больших данных.

6 голосов
/ 22 мая 2014

Да, это можно сделать, используя dblink, хотя и с существенными соображениями производительности.

В следующем примере требуется, чтобы у текущего пользователя SQL были разрешения на обе базы данных.Если db2 не находится в том же кластере, вам нужно заменить dbname=db2 на полную строку подключения, определенную в документации dblink .

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 перед выполнением объединения.

6 голосов
/ 13 января 2011

Нет, ты не можешь. Вы можете использовать dblink для подключения из одной базы данных в другую, но это не поможет, если вы ищете JOIN.

Вы не можете использовать разные SCHEMA в одной базе данных для хранения всех ваших данных?

4 голосов
/ 17 февраля 2012

Вам нужно использовать dblink ... как уже упоминалось выше, araqnid работает примерно так:

выберите ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * из информационной_схемы.Колонны ST полное внешнее соединение dblink ('dbname = otherdatabase', 'select Table_Name, Column_Name из information_schema.Columns ') DV (текст Table_Name, Column_Name text) на ST.Table_Name = DV.Table_name и ST.Column_Name = DV.Column_Name где ST.Column_Name равно нулю или DV.Column_Name равно NULL

2 голосов
/ 17 апреля 2018

Всего несколько шагов, и Вы можете достичь цели: следуйте этой ссылке шаг за шагом

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 голосов
/ 22 августа 2015

Вы используете расширение dblink для postgresql.

Ссылка взята из этой статьи:

Расширение DbLink для PostgreSQL, которое используется для подключения одной базы данных к другой.

Установить расширение 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...