2012-11-25 11 views
13

Was die mysql ich brauche, ist das Ergebnis weiter unten diesen 2 Tabellen zu erreichen:MySQL wahr Reihe merge ... nicht nur eine Vereinigung

tabelle1:

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | alan | 
| 2 | bob | 
| 3 | dave | 
+----+-------+ 

table2:

+----+---------+ 
| id | state | 
+----+---------+ 
| 2 | MI  | 
| 3 | WV  | 
| 4 | FL  | 
+----+---------+ 

Ich möchte eine temporäre Ansicht erstellen, die so aussieht

gewünschtes Ergebnis:

Ich versuchte eine MySQL-Verbindung, aber das folgende Ergebnis ist nicht das, was ich will.

create view table3 as 
(select id,name,"" as state from table1) 
union 
(select id,"" as name,state from table2) 

table3 Vereinigung Ergebnis:

+----+---------+---------+ 
| id | name | state | 
+----+---------+---------+ 
| 1 | alan |   | 
| 2 | bob  |   | 
| 3 | dave |   | 
| 2 |   | MI  | 
| 3 |   | WV  | 
| 4 |   | FL  | 
+----+---------+---------+ 
+0

Sehr gute Demonstration und Definition des Problems 1 – SaidbakR

Antwort

9

Sie müssen genannt einen SQL-Operator verwenden JOIN zu bekommen, was Sie wollen.

JOIN ist ein grundlegender Teil der SQL-Sprache, genauso wie eine while-Schleife für andere Programmiersprachen.

starten hier: A Visual Explanation of SQL Joins

Eine andere Denkweise vs. UNION JOIN ist:

  • UNION anhängt zusammen Reihen.
  • JOIN fügt Spalten zusammen an.

Zum Beispiel:

SELECT * 
FROM table1 
JOIN table2 USING (id); 

Dies ist eine Art der Verknüpfung, die gibt nur die Zeilen, für die eine passende ID in beiden Tabellen vorhanden ist. Aber Sie wollen alle diese IDs, für die eine Zeile in mindestens einer Tabelle existiert.

SELECT * 
FROM table1 
LEFT OUTER JOIN table2 USING (id); 

Dies wird alle Zeilen von Tabelle 1, mit ihren passenden Zeilen in table2. Aber das Gegenteil zu bekommen, würden wir brauchen:

SELECT * 
FROM table1 
RIGHT OUTER JOIN table2 USING (id); 

SQL definiert auch eine FULL OUTER JOIN, die beide auf einmal tun würde, aber leider hat MySQL nicht, dass ein Teil der SQL-Standards implementiert. Aber wir können UNION verwenden, um die beiden Arten von Joins zu kombinieren. Union löscht standardmäßig doppelte Zeilen.

update: Ich habe das Problem, und habe es zur Arbeit. Es stellt sich heraus, dass Sie die Spalten explizit benennen müssen, um sicherzustellen, dass sie sich in den beiden unionierten Abfragen in denselben Spalten befinden. Hier ist die Abfrage, die, kopiert von meinen Terminal-Fenstern funktioniert:

SELECT id, name, state 
FROM table1 
LEFT OUTER JOIN table2 USING (id) 
UNION 
SELECT id, name, state 
FROM table1 
RIGHT OUTER JOIN table2 USING (id); 

Es ist eine gute Gewohnheit im Allgemeinen zu vermeiden, mit SELECT *, und dies ist nur ein weiterer Fall, in dem es ist eine gute Idee.

Auch hatte ich im Abfrage-Beispiel zuvor ein überflüssiges Semikolon hinterlassen. Das war nur ein Tippfehler meinerseits.

Diese Abfrage erzeugt die folgende Ausgabe, von meinem Terminal-Fenster kopiert:

+----+------+-------+ 
| id | name | state | 
+----+------+-------+ 
| 1 | alan | NULL | 
| 2 | bob | MI | 
| 3 | dave | WV | 
| 4 | NULL | FL | 
+----+------+-------+ 

PS: Danke, dass Sie so klar die Frage zu fragen!

+0

das Ergebnis nahe scheint, aber nicht das gewünschte Ergebnis erwähnt oben. Die Formatierung wird in diesem Kommentar nicht gleich unterstützt, daher habe ich das Ergebnis in die Frage eingefügt. – panofish

+0

@panfish 'SELECT * FROM table1 LINKE VERBINDUNG table2 ON (table1.id = table2.id) UNION SELECT * FROM table1 RECHTE VERBINDUNG table2 ON (table1.id = table2.id)' ist im Grunde das Gleiche wie das, was BillKarwin angibt, aber erreicht etwas andere Ergebnisse .. kann mehr sein, was Sie brauchen. – Pebbl

+0

näher, aber immer noch nicht die gewünschte Tabelle ... vielleicht ist dies ein Beispiel, das nur programmgesteuert durchgeführt werden kann? – panofish

0

Sie benötigen FULL OUTER JOIN:

SELECT coalesce(a.id, b.id), a.name, b.state 
FROM table1 a 
FULL OUTER JOIN table2 b ON (a.id = b.id) 
+3

MySQL unterstützt nicht 'FULL OUTER JOIN' –

+0

yup ... volle äußere Join funktionierte nicht in mysql – panofish