2016-10-17 3 views
-1

Hallo Ich habe zwei Datenbanken und jede hat die gleichen Tabellen. Zum Beispiel habe ich Tabelle world genannt und es verfügt über 4 Spalten: pkey1, pkey2, companyid, company_nameAuswahl verschiedener Spalten aus Datenbanken

Ich habe eine Abfrage, die für die Zeilen durchsucht, die die gleiche pkey1 und pkey2 haben aber eine oder viele ihrer anderen Eigenschaft unterscheidet sich in die 2 Tische. Meine Frage ist, wie kann ich nur die verschiedenen Eigenschaften sehen?

Hier ist meine Abfrage wählt die Zeilen, die die gleiche pkey1 und pkey2 wie kann ich es aktualisieren, um die Spalten, wo es Unterschiede in beiden Datenbanken und natürlich, wenn es keinen Unterschied gibt das Ergebnis der Abfrage sollte zurückkehren NULL in der Spalte hier ist ein Beispiel, was ich erreichen möchte:

in der ersten Datenbank (1,1,345, 'Ron'), zweite Datenbank (1,1,377, 'Ron') sollte das Ergebnis sein (1,1,345 , null)

+0

"Hier ist meine Abfrage" - Nein, es gibt keine Frage in Ihrer Frage. Bearbeiten Sie Ihre Frage und fügen Sie die create table-Anweisungen für alle beteiligten Tabellen, die vollständige SQL-Abfrage, die Sie verwenden, einige Beispieldaten und die erwartete Ausgabe hinzu. [_Formatted_] (http://stackoverflow.com/editing-help#code) Text bitte, [keine Screenshots] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload -images-of-code-on-so-wenn-eine Frage zu stellen/285557 # 285557) –

Antwort

1

Um Daten in einer anderen Datenbank zu referenzieren, benötigen Sie einen Datenbanklink. Da Sie PostgreSQL verwenden, sollte diese Dokumentation helfen;

https://www.postgresql.org/docs/current/static/dblink.html

Sie müssen diesen Befehl verwenden, um den Link (in diesem Fall mit einem Namen) zu schaffen;

SELECT dblink_connect('CONNECTIONNAME', 'REMOTEDBCONNECTIONSTRING'); 

Dann können Sie diese neue Verbindung über eine Select-Abfrage verwenden;

SELECT * 
FROM dblink('CONNECTIONNAME','SELECT * FROM foo') AS t(a int, b text, c text[]); 

Und ersetzen ‚foo‘ mit ‚Welt‘ Tabellenname, dann die AS in die Variablen ändern, die pkey1 beziehen, pkey2, CompanyID, company_name usw.

1

Wenn Ihre Datenbanken, Sie verknüpft können beide Tabellen mit „Fall“ Aussage Prüfung teilnehmen und wenn der Wert geändert hat:

select a.pkey1, a.pkey2, 
case when a.companyid <> b.companyid then a.companyid else null end as companyid, 
case when a.company_name <> b.company_name then a.company_name else null end as company_name 
from db1.dbo.world a 
inner join db2.dbo.world b on a.pkey1 = b.pkey1 and a.pkey2 = b.pkey2 

wenn Sie Zeilen mit keinen Unterschied verzichten möchten, können Sie „außer“ verwenden:

select a.pkey1, a.pkey2, 
case when a.companyid <> b.companyid then a.companyid else null end as companyid, 
case when a.company_name <> b.company_name then a.company_name else null end as company_name 
from (
    select pkey1, pkey2, companyid, company_name 
    from db1.dbo.world 
    except 
    select pkey1, pkey2, companyid, company_name 
    from db2.dbo.world) a 
inner join db2.dbo.world b on a.pkey1 = b.pkey1 and a.pkey2 = b.pkey2 
+0

'db1.dbo.world' ist ungültig für Postgres –

+0

Was machen wir, wenn wir 1 mil Spalten haben, Fall gewonnen ' t arbeiten? – Lara

Verwandte Themen