小编典典

连接具有相同列名的多个表

sql

我的MySQL数据库中有这些表:

通用表:

+----generalTable-----+
+---------------------+
| id | scenario | ... |
+----+----------+-----+
| 1  | facebook | ... |
| 2  | chief    | ... |
| 3  | facebook | ... |
| 4  | chief    | ... |

Facebook表:

+----facebookTable-----+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 1  | 12345678  | ... |
| 3  | 45832458  | ... |

首席表:

+------chiefTable------+
+----------------------+
| id | expiresAt | ... |
+----+-----------+-----+
| 2  | 43547343  | ... |
| 4  | 23443355  | ... |

基本上,常规表包含一些( 显然
)常规数据。基于generalTable.scenario,您可以在其他两个表中查找更多详细信息,这些表在某些熟悉的列中(例如,expiresAt),而在其他一些列中则不然。

我的问题是,如何仅通过一个查询就可以获取generalTable和正确的明细表的联接数据。

所以,我想这样的查询:

SELECT id, scenario, expiresAt 
FROM generalTable
    JOIN facebookTable
        ON generalTable.id = facebookTable.id
    JOIN chiefTable
        ON generalTable.id = chiefTable.id

和这样的输出:

| id | scenario | expiresAt |
+----+----------+-----------+
| 1  | facebook | 12345678  |
| 2  | chief    | 43547343  |
| 3  | facebook | 45832458  |
| 4  | chief    | 23443355  |

但是,这是行不通的,因为facebookTable和ChiefTable都有不明确的列名“
expiresAt”。为了易于使用,我想保持这种方式。结果表还应该只有一列“
expiresAt”,该列会自动用facebookTable或ChiefTable中的正确值填充。

我觉得这实际上是一个非常容易的任务,但是对我来说这是一个漫长的工作日,并且您知道考虑问题的时间如此之久,并且看不到可能的简单解决方案。那么,你能帮我吗?

另外,对不起,英语不好


阅读 148

收藏
2021-04-07

共1个答案

小编典典

您可能要考虑将expiredAt添加到您的常规表,并将其从其他表中删除,以删除架构中的重复项,并使此特定查询更简单。

如果需要坚持使用当前架构,则可以使用表别名来解决名称歧义,并使用两个联接和一个联合来创建您要查找的结果:

SELECT g.id, g.scenario, f.expiresAt 
FROM generalTable g
JOIN facebookTable f
ON g.id = f.id
UNION ALL
SELECT g.id, g.scenario, c.expiresAt 
FROM generalTable g
JOIN chiefTable c
ON g.id = c.id;

另一个答案中提到的外部联接方法也可以解决该问题。

2021-04-07