web-dev-qa-db-fra.com

Jointure des résultats de deux bases de données distinctes

Est-il possible de JOIN lignes à partir de deux bases de données postgres distinctes?

Je travaille avec un système avec quelques bases de données sur un serveur et parfois j'ai vraiment besoin d'une telle fonctionnalité.

51
sennin

Selon http://wiki.postgresql.org/wiki/FAQ

Il n'y a aucun moyen d'interroger une base de données autre que l'actuelle. Étant donné que PostgreSQL charge des catalogues système spécifiques à la base de données, il est difficile de savoir comment une requête inter-base de données devrait même se comporter. contrib/dblink permet des requêtes entre bases de données à l'aide d'appels de fonction. Bien sûr, un client peut également établir des connexions simultanées à différentes bases de données et fusionner les résultats côté client.

[~ # ~] modifier [~ # ~] : 3 ans plus tard (mars 2014), cette FAQ entry a été révisé et est plus utile:

Comment effectuer des requêtes à l'aide de plusieurs bases de données?

Il n'existe aucun moyen d'interroger directement une base de données autre que la base actuelle. Étant donné que PostgreSQL charge des catalogues système spécifiques à la base de données, il est difficile de savoir comment une requête inter-base de données devrait même se comporter.

La prise en charge SQL/MED dans PostgreSQL permet de créer un "wrapper de données étranger", reliant les tables d'une base de données distante à la base de données locale. La base de données distante peut être une autre base de données sur la même instance PostgreSQL, ou une base de données à l'autre bout du monde, peu importe. postgres_fdw est intégré à PostgreSQL 9.3 et inclut un support en lecture/écriture; une version en lecture seule pour 9.2 peut être compilée et installée en tant que module contrib.

contrib/dblink permet des requêtes entre bases de données à l'aide d'appels de fonction et est disponible pour les versions beaucoup plus anciennes de PostgreSQL. Contrairement à postgres_fdw, il ne peut pas "pousser vers le bas" les conditions vers le serveur distant, donc il va souvent récupérer beaucoup plus de données que vous n'en avez besoin.

Bien sûr, un client peut également établir des connexions simultanées à différentes bases de données et fusionner les résultats côté client.

53
ndtreviv

Oubliez dblink!

Dites bonjour à Postgres_FDW :

Pour préparer l'accès à distance à l'aide de postgres_fdw:

  1. Installez le postgres_fdw extension utilisant CREATE EXTENSION.

  2. Créez un objet serveur étranger, à l'aide de CREATE SERVER, pour représenter chaque base de données distante à laquelle vous souhaitez vous connecter. Spécifiez les informations de connexion, à l'exception de l'utilisateur et du mot de passe, comme options de l'objet serveur.

  3. Créez un mappage utilisateur à l'aide de CREATE USER MAPPING, pour chaque utilisateur de base de données que vous souhaitez autoriser à accéder à chaque serveur étranger. Spécifiez le nom d'utilisateur distant et le mot de passe à utiliser comme options d'utilisateur et de mot de passe du mappage utilisateur.

  4. Créez une table étrangère en utilisant CREATE FOREIGN TABLE ou IMPORT FOREIGN SCHEMA, pour chaque table distante à laquelle vous souhaitez accéder. Les colonnes de la table étrangère doivent correspondre à la table distante référencée. Vous pouvez cependant utiliser des noms de table et/ou de colonne différents de ceux de la table distante, si vous spécifiez les noms distants corrects comme options de l'objet de table étranger.

Désormais, il vous suffit de SELECT d'une table étrangère pour accéder aux données stockées dans sa table distante sous-jacente.

C'est vraiment utile même sur des données volumineuses.

27
Luiz Vaz

Oui, il est possible de le faire en utilisant dblink mais avec des considérations de performances importantes.

L'exemple suivant nécessite que l'utilisateur SQL actuel dispose d'autorisations sur les deux bases de données. Si db2 ne se trouve pas sur le même cluster, vous devrez alors remplacer dbname=db2 avec la chaîne de connexion complète définie dans la documentation 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;

Si table2 est très volumineux, vous pouvez rencontrer des problèmes de performances car la sous-requête charge l'intégralité de table2 avant d'effectuer la jointure.

7
Elliot B.

Non tu ne peux pas. Vous pouvez utiliser dblink pour vous connecter d'une base de données à une autre base de données, mais cela n'aidera pas si vous recherchez JOIN.

Vous ne pouvez pas utiliser différents SCHEMA dans une seule base de données pour stocker toutes vos données?

6
Frank Heikens

Vous devez utiliser dblink ... comme araqnid mentionné ci-dessus, quelque chose comme ça fonctionne bien:

sélectionnez ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * dans information_schema.Columns ST full jointure externe dblink ('dbname = otherdatabase', 'select Table_Name, Column_Name from information_schema.Columns') DV (texte Table_Name, Texte Column_Name) sur ST.Table_Name = DV.Table_name et ST.Column_Name = DV.Column_Name où ST.Column_Name est null ou DV.Column_Name est NULL

4
kenyee

Juste quelques étapes et vous pouvez atteindre l'objectif: suivez cette référence étape par étape

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

Vous avez utilisé l'extension dblink de postgresql.

Prise de référence de cet article:

Extension DbLink de PostgreSQL qui est utilisée pour connecter une base de données à une autre base de données.

Installez l'extension DbLink.

CREATE EXTENSION dblink;

Vérifiez 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%';

J'ai déjà préparé une démonstration complète à ce sujet. Veuillez visiter mon article pour savoir étape par étape comment exécuter une requête de base de données croisée dans Postgresql.

2
Anvesh