2016-05-26 15 views
0

Ich habe mehrere Datenbanken (nobu und bu) mit exakt gleichen Tabellen (eine ist nur eine Sicherung der anderen).
Ich brauche Werte aus einer Tabelle aus beiden Datenbanken, um sie mit anderen Tabellen zu verbinden, dann verwende ich offensichtlich eine UNION. Die Sache ist, einige Produkte haben unterschiedliche Namen in den Tabellen von bu und nobu.
Ich habe dann versucht, nur eine Datenbank über diese Tabelle zu wählen (ich verwendete nobu, da es die neueste ist), aber ich habe festgestellt, dass einige Produkte nicht in nobu sind, aber tatsächlich in bu sind (was es kein Backup mehr macht).Machen Sie eine "LINKE UNION" Abfrage

Der Teil der Abfrage, in der ich brauche das wie folgt aussieht:

Damit ich Duplikate

... INNER JOIN (SELECT * FROM nobu.dbo.product UNION SELECT * FROM bu.dbo.product) AS product 
ON [...] INNER JOIN (SELECT * FROM nobu.dbo.name UNION SELECT bu.dbo.name) AS name 
ON product.key = name.id ... 

Damit erhalte ich einige der Produkte mit NULL Namen, da es existiert nicht auf nobu

... INNER JOIN (SELECT * FROM nobu.dbo.product UNION SELECT * FROM bu.dbo.product) AS product 
ON [...] INNER JOIN (SELECT * FROM nobu.dbo.name) AS name 
ON product.key = name.id ... 

Ich wollte wissen, ob es eine Möglichkeit gibt, eine LEFT UNION oder etwas ähnliches durchzuführen, um alle Werte von nobu zu erhalten, und wenn es keine Daten gibt, nehmen Sie die von bu, ohne die Duplikate zu bekommen (da sie unterschiedlich sein können Namen in beiden Datenbanken).

+0

Verwenden 'GROUP BY' Schlüsselwort in Ihrem Unter Abfrage nach den Parametern, die Sie eindeutig abrufen möchten. –

Antwort

3

Wenn nur die Namen wurden geändert, und darauf hindeutet, dass Tabellennamen ist nicht ein großer Tisch und wird nicht Performance-Probleme schafft dann dieser Code unten wird die Arbeit machen:

INNER JOIN (SELECT * FROM nobu.dbo.product UNION SELECT * FROM bu.dbo.product) AS product 
ON [...] INNER JOIN (SELECT * FROM nobu.dbo.name UNION SELECT bu.dbo.name WHERE id NOT IN (SELECT id FROM nobu.dbo.name)) AS name 
ON product.key = name.id 
+0

Ich habe seit Tagen versucht, dies zu tun. Danke für Ihre Hilfe, es ist genau das, was ich brauchte !! Und bei Performance-Problemen ist mein Tabellenname ziemlich groß (mehr als 5000 Einträge und mehr als 30 Spalten). Was schlagen Sie vor, um die Leistung zu steigern? – tektiv

+0

Die Verwendung von 'IN' Schlüsselwort ist nicht für große Daten empfohlen, stattdessen verwenden Sie' GROUP BY' –

+0

Gruppierung von ist eine Option, aber Sie sollten entscheiden, welche Funktion für Name, min, max oder was verwenden und das wird Ihnen Namen von jedem geben Tabelle im Falle von Duplikaten und basierend auf Anfrage war es Formtabelle A zu bekommen und nur was in Tabelle B fehlt. In dieser Situation funktioniert nur die obige Lösung. –