不带伪列的不同字段上的MySQL并集
因此,假设我有2个或更多由不同列组成的表,其中不一定存在共享键(id):不带伪列的不同字段上的MySQL并集,mysql,join,field,union,Mysql,Join,Field,Union,因此,假设我有2个或更多由不同列组成的表,其中不一定存在共享键(id): Alpha: +----+-------+-------+-------+ | id | paula | randy | simon | +----+-------+-------+-------+ | 1 | 8 | 7 | 2 | | 2 | 9 | 6 | 2 | | 3 | 10 | 5 | 2 | +----+-------+----
Alpha:
+----+-------+-------+-------+
| id | paula | randy | simon |
+----+-------+-------+-------+
| 1 | 8 | 7 | 2 |
| 2 | 9 | 6 | 2 |
| 3 | 10 | 5 | 2 |
+----+-------+-------+-------+
Beta:
+----+---------+-----+------------+------+
| id | is_nice | sex | dob | gift |
+----+---------+-----+------------+------+
| 2 | 1 | F | 1990-05-25 | iPod |
| 3 | 0 | M | 1990-05-25 | coal |
+----+---------+-----+------------+------+
Gamma:
+----+---------+--------+
| id | is_tall | is_fat |
+----+---------+--------+
| 1 | 1 | 1 |
| 99 | 0 | 1 |
+----+---------+--------+
理想的效果是在id上将表混合在一起,在数据不可用的地方插入空值:
+----+-------+-------+-------+---------+-----+------------+------+---------+--------+
| id | paula | randy | simon | is_nice | sex | dob | gift | is_tall | is_fat |
+----+-------+-------+-------+---------+-----+------------+------+---------+--------+
| 1 | 8 | 7 | 2 | | | | | 1 | 1 |
| 2 | 9 | 6 | 2 | 1 | F | 1990-05-25 | iPod | | |
| 3 | 10 | 5 | 2 | 0 | M | 1990-05-25 | coal | 1 | 1 |
| 99 | | | | | | | | 0 | 0 |
+----+-------+-------+-------+---------+-----+------------+------+---------+--------+
我可以使用空的'dummy'列和UNION(),但如果表的数量很大,这似乎是一个巨大的难题。我想有一种连接方法可以用来实现这一点,但我需要一些帮助来解决这个问题
这项工作:
SELECT `id`, `paula`, `randy`, ..., NULL AS `is_nice`, ... FROM `Alpha`
UNION SELECT `id`, NULL AS `paula`, ..., FROM `Beta`
UNION SELECT `id`, NULL AS `paula`, ..., `is_fat` FROM `Gamma` ;
但这确实让人觉得这样做是错误的。当我想添加额外的表时,如何在不必编辑一行又一行SQL语句的情况下获得相同的结果呢
提前谢谢 您想使用
左连接
s
在您的示例中:
SELECT id_t.id, a.paula, a.randy, a.simon, b.is_nice, b.sex, b.dob, b.gift, g.is_tall, g.is_fat
FROM (SELECT DISTINCT id FROM alpha,beta,gamma) as id_t
LEFT JOIN alpha a ON a.id = id_t.id
LEFT JOIN beta b on b.id = id_t.id
LEFT JOIN gamma g on g.id = id_t.id
您想使用
LEFT JOIN
s
在您的示例中:
SELECT id_t.id, a.paula, a.randy, a.simon, b.is_nice, b.sex, b.dob, b.gift, g.is_tall, g.is_fat
FROM (SELECT DISTINCT id FROM alpha,beta,gamma) as id_t
LEFT JOIN alpha a ON a.id = id_t.id
LEFT JOIN beta b on b.id = id_t.id
LEFT JOIN gamma g on g.id = id_t.id
如果表除了
id
之外不共享其他列,则可以使用简单易写(但更容易断开):
如果表除了
id
之外不共享其他列,则可以使用简单易写(但更容易断开):
好的,但看起来ypercube可能是第一个。好的,但看起来ypercube可能是第一个。实际上,您的查询不会这样工作。您将在结果中得到7行。实际上,您的查询不会这样工作。您将在结果中得到7行。
SELECT
*
FROM
( SELECT id
FROM Alpha
UNION
SELECT id
FROM Beta
UNION
SELECT id
FROM Gamma
) AS allid
NATURAL LEFT JOIN
Alpha
NATURAL LEFT JOIN
Beta
NATURAL LEFT JOIN
Gamma