Объединение результатов из двух отдельных баз данных

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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Забудьте о dblink!

Поздороваться с Postgres_FDW:

Чтобы подготовиться к удаленному доступу с помощью postgres_fdw:

  • Установите расширение postgres_fdw, используя CREATE EXTENSION.

  • Создайте объект внешнего сервера, используя CREATE SERVER, чтобы представлять каждую удаленную базу данных, к которой вы хотите подключиться. Укажите соединение информации, кроме пользователя и пароля, в качестве параметров сервера объект.

  • Создайте сопоставление пользователя, используя CREATE USER MAPPING, для каждого пользователя базы данных, который вы хотите разрешить для доступа к каждому иностранному серверу. Указывать имя удаленного пользователя и пароль для использования в качестве параметров пользователя и пароля отображения пользователя.

  • Создайте внешнюю таблицу, используя CREATE FOREIGN TABLE или IMPORT FOREIGN SCHEMA, для каждой удаленной таблицы, к которой вы хотите получить доступ. Столбцы внешней таблицы должны соответствовать удаленной таблице, на которую имеется ссылка. Ты можешь, однако используйте имена таблиц и/или столбцов, отличные от удаленных table, если вы укажете правильные удаленные имена в качестве параметров внешний объект таблицы.

Теперь вам нужно только SELECT из внешней таблицы для доступа к данным хранится в его базовой удаленной таблице.

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

Ответ 3

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

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

Ответ 4

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

выберите ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * from information_schema.Columns ST полное внешнее соединение dblink ('dbname = otherdatabase', 'select Table_Name, Column_Name from information_schema.Columns ') DV (текст таблицы Table_Name, Column_Name текст) по ST.Table_Name = DV.Table_name и ST.Column_Name = DV.Column_Name где ST.Column_Name имеет значение null или DV.Column_Name имеет значение NULL

Ответ 5

Да, это можно сделать с помощью 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

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