2012-11-25 9 views
13

Qual è il mysql ho bisogno per ottenere il risultato qui sotto riportate queste 2 tabelle:MySQL vera unione righe ... non solo un'unione

Tabella 1:

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

table2:

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

Voglio creare una vista temporanea simile a questa

risultato desiderato:

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

Ho provato un unione mysql ma il seguente risultato non è quello che voglio.

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

table3 risultato dell'unione:

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

Molto buona dimostrazione e definizione del problema +1 – SaidbakR

risposta

9

È necessario utilizzare un operatore SQL chiamato uniscono per ottenere quello che vuoi.

JOIN è una parte fondamentale del linguaggio SQL, tanto quanto un ciclo while per altri linguaggi di programmazione.

Inizia da qui: A Visual Explanation of SQL Joins

Un altro modo di pensare di JOIN vs. UNION è:

  • UNION aggiunge righe insieme.
  • JOIN aggiunge le colonne insieme.

Ad esempio:

SELECT * 
FROM table1 
JOIN table2 USING (id); 

Questo è uno stile di join che restituisce solo le righe per i quali esiste un id corrispondente in entrambe le tabelle. Ma tu vuoi tutti quegli id ​​di cui esiste una riga in almeno un tavolo o l'altro.

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

Ciò ottiene tutte le righe da table1, con le loro righe corrispondenti in table2. Ma per ottenere il contrario, avremmo bisogno:

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

SQL definisce anche un full outer join che fare entrambe le cose in una volta, ma purtroppo MySQL non ha messo in atto quella parte dello standard SQL. Ma possiamo usare UNION per combinare i due tipi di join. Union eliminerà le righe duplicate per impostazione predefinita.

aggiornamento: Mi sono preoccupato di questo e l'ho fatto funzionare. Si scopre che devi nominare le colonne esplicitamente, per assicurarti che siano nelle stesse colonne in entrambe le query unionizzate. Ecco la domanda che funziona, copiato dalla mia finestra del terminale:

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); 

E 'una buona abitudine, in generale, di evitare l'uso SELECT *, e questo è solo un caso di più dove è una buona idea.

Inoltre, avevo già lasciato un punto e virgola superfluo nell'esempio di query. Quello era solo un errore di battitura da parte mia.

Questa interrogazione produce il seguente output, copiato dalla mia finestra del terminale:

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

PS: Grazie per porre la domanda in modo così chiaro!

+0

il risultato sembra vicino, ma non il risultato desiderato menzioni sopra. La formattazione non è supportata allo stesso modo in questo commento, quindi ho incollato il risultato nella domanda. – panofish

+0

@panofish 'SELECT * FROM table1 LEFT JOIN table2 ON (table1.id = table2.id) UNION SELECT * FROM table1 RIGHT JOIN table2 ON (table1.id = table2.id)' è fondamentalmente lo stesso di quanto afferma BillKarwin ma raggiunge risultati leggermente diversi .. potrebbe essere più quello di cui hai bisogno. – Pebbl

+0

più vicino ma ancora non produce la tabella desiderata ... forse questo è un esempio che può essere fatto solo programmaticamente? – panofish

0

È necessario 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 non supporta 'FULL OUTER JOIN' –

+0

yup ... il join esterno completo non ha funzionato in mysql – panofish

Problemi correlati