16

これらの2つのテーブルが与えられた場合、以下の結果を達成するために必要な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)

table3 ユニオンの結果:

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

2 に答える 2

9

必要なものを取得するには、JOIN という SQL 演算子を使用する必要があります。

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

ここから開始: SQL 結合の視覚的な説明

JOIN と UNION の別の考え方は次のとおりです。

  • 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 種類の結合を組み合わせるために使用できます。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: 質問をとても明確にしてくれてありがとう!

于 2012-11-25T02:00:06.823 に答える
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)
于 2012-11-25T02:01:54.490 に答える