2012-11-25 2 views
13

私はこれらの2つのテーブル与えられた以下の結果を達成するために必要なmysqlのは何か:MySQLの真行...マージだけではなく、労働組合

TABLE1:

+----+-------+ 
| 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

非常に良いデモや定義を – SaidbakR

答えて

9

あなたが望む結果を得るために、JOINと呼ばれるSQL演算子を使用する必要があります。

JOINはSQL言語の基本的な部分ですが、whileループは他のプログラミング言語用です。ここ

スタート:UNION対のJOINの思考のA Visual Explanation of SQL Joins

もう一つの方法は次のとおりです。

  • UNIONは一緒に行を追加します。
  • JOINは、列を一緒に追加します。例えば

SELECT * 
FROM table1 
JOIN table2 USING (id); 

これは、一致するIDが両方のテーブルに存在するためのみ行を返す結合のスタイルです。しかし、少なくとも1つのテーブルまたは他のテーブルに行が存在するすべての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を使用して2つのタイプの結合を結合することができます。連合はデフォルトで重複行を排除します。

更新:私はこれをトラブルシューティングして動作させました。両方の結合されたクエリの同じ列にあることを確認するために、列に明示的に名前を付ける必要があります。ここに私のターミナルウィンドウからコピーされた作品クエリは、です:

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 *を使用しないように、一般的に良い習慣だし、これは良いアイデアだとちょうど1以上の場合です。

また、以前のクエリの例では、余分なセミコロンを残していました。それは私の一部の誤植でした。

+----+------+-------+ 
| 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必要があります。問題1の

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は 'FULL OUTER JOIN'をサポートしていません –

+0

yup ... mysqlで完全な外部結合が機能しませんでした – panofish

関連する問題