2012-11-25 39 views
13

什麼是我需要實現下面給出這兩個表中的結果MySQL的:MySQL的真行合併......不只是一個工會

表1:

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

表2:

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

我想創建一個看起來像這樣的臨時視圖

想要的結果:

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

我試過一個mysql聯盟,但以下結果不是我想要的。

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

表3聯合的結果:

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

很好的示範和定義問題+1的 – SaidbakR

回答

9

您需要使用一種稱爲SQL JOIN操作得到你想要的東西。

JOIN是SQL語言的基本組成部分,其他編程語言的while循環也是如此。

從這裏開始:A Visual Explanation of SQL Joins

JOIN與UNION的思維的另一種方法是:

  • UNION追加排在一起。
  • JOIN將列附加在一起。

例如:

SELECT * 
FROM table1 
JOIN table2 USING (id); 

這是一起返回爲其匹配的ID兩個表中存在行的風格。但是你希望所有那些至少在一個表或其他表中存在一行的ID。

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

這將獲取table1中的所有行,以及它們在table2中的匹配行。但是爲了得到相反的,我們需要:

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

SQL還定義了一個FULL OUTER JOIN這將兩者同時進行,但遺憾的是MySQL已經沒有實現SQL標準的一部分。但是我們可以使用UNION來組合這兩種類型的連接。 Union將默認消除重複行。

更新:我麻煩這個,並得到它的工作。事實證明,您必須明確命名列,以確保它們在聯合查詢中的相同列中。下面是工作的查詢,從我的終端窗口複製:

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

這是一般避免使用SELECT *一個良好的習慣,而這僅僅是多了一個情況下這是一個好主意。

此外,我在查詢示例之前留下了一個多餘的分號。這只是我的一個錯字。

,該查詢產生下面的輸出,從我的終端窗口複製:

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

PS:感謝你提出這個問題這麼清楚!

+0

的結果似乎接近,但不期望的結果上面提到。 此評論中的格式不支持相同,所以我將結果粘貼到問題中。 – 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)'與BillKarwin的狀態基本相同,但實現了稍有不同的結果..可能更多你所需要的。 – Pebbl

+0

更接近,但仍然沒有產生所需的表...也許這是一個只能通過編程完成的例子嗎? – panofish

0

您需要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不支持'全外連接' –

+0

yup ...全外連接在mysql中不起作用 – panofish