16

给定这两个表,我需要什么 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 union 但以下结果不是我想要的。

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

2 回答 2

9

您需要使用名为 JOIN 的 SQL 运算符来获得所需的内容。

JOIN 是 SQL 语言的基本部分,就像 while 循环适用于其他编程语言一样。

从这里开始: SQL 连接的可视化解释

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来组合这两种类型的连接。默认情况下,联合将消除重复的行。

更新: 我解决了这个问题,并让它工作。事实证明,您必须明确命名列,以确保它们在两个联合查询中位于相同的列中。这是从我的终端窗口复制的有效查询:

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 回答