2012-11-25 12 views
13

Jaki jest mysql muszę osiągnąć wynik poniżej podanych tych 2 tabele:MySQL prawdziwy rząd seryjnej ... nie tylko unia

Tabela 1:

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

Table2:

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

Chcę utworzyć tymczasowy widok, który będzie wyglądać tak, jak ten

żądany wynik:

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

Próbowałem związku mysql, ale następujący wynik nie jest tym, co chcę.

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

table3 wynik unia:

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

Bardzo dobrą demonstrację i definicji problemu +1 – SaidbakR

Odpowiedz

9

trzeba użyć operatora o nazwie SQL JOIN, aby uzyskać to, co chcesz.

JOIN jest podstawową częścią języka SQL, podobnie jak pętla while dla innych języków programowania.

Rozpocznij tutaj: A Visual Explanation of SQL Joins

Innym sposobem myślenia JOIN vs. UNII jest:

  • UNION dołącza wierszy razem.
  • JOIN dołącza kolumny razem.

Na przykład

SELECT * 
FROM table1 
JOIN table2 USING (id); 

Ten styl sprzężenia, która zwraca tylko wierszy, dla których istnieje ID dopasowanie obu stołów. Ale chcesz wszystkie te id, dla których istnieje wiersz w co najmniej jednej tabeli lub drugiej.

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

Spowoduje to pobranie wszystkich wierszy z tabeli 1 wraz z pasującymi wierszami w tabeli 2. Jednak, aby uzyskać na odwrót, to musimy:

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

SQL definiuje również FULL OUTER JOIN co zrobić oba na raz, ale niestety MySQL nie wdrożył tę część standardu SQL. Ale możemy użyć UNION, aby połączyć dwa typy złączeń. Union domyślnie eliminuje duplikaty wierszy.

aktualizacja: I troubleshot to, i dostałem to do pracy. Okazuje się, że musisz wyraźnie nazwać kolumny, aby upewnić się, że znajdują się w tych samych kolumnach w obu połączonych zapytaniach. Tutaj jest kwerenda, która działa, skopiowane z moim oknie terminala:

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

To dobry zwyczaj w ogóle unikać używania SELECT *, a jest to tylko jeden przypadek, w którym jest to dobry pomysł.

Również, zostawiłem niepotrzebny średnik w powyższym przykładzie kwerendy. To był tylko literówka z mojej strony.

Ta kwerenda produkuje następujące dane wyjściowe, kopiowane z moim oknie terminala:

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

PS: Dziękuję za zaproszenie na pytanie tak jasno!

+0

wynik wydaje się blisko, ale nie pożądany rezultat wspomina powyżej. Formatowanie nie jest obsługiwane w tym komentarzu, więc wkleiłem wynik do pytania. – panofish

+0

@panofish 'WYBIERZ * Z tabeli1 LEWY POŁĄCZENIE table2 ON (table1.id = table2.id) WYBÓR UNII * Z tabeli 1 PRAWEJ tabeli JOIN2 WŁ (tabela1.id = tabela2.id)' jest w zasadzie taki sam jak to, co stwierdza BillKarwin, ale osiąga trochę inne wyniki. Może być więcej, czego potrzebujesz. – Pebbl

+0

bliżej, ale nadal nie tworzy pożądanej tabeli ... być może jest to przykład, który można zrobić tylko programowo? – panofish

0

Trzeba 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 nie obsługuje funkcji "PEŁNE ZEWNĘTRZNE" –

+0

tak ... pełne sprzężenie zewnętrzne nie działa w mysql – panofish