当前位置: 首页 > 面试题库 >

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

明宜年
2023-03-14
问题内容

我的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中的正确值填充。

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

另外,对不起,英语不好


问题答案:

您可能要考虑将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;

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



 类似资料:
  • 我正在运行以下JOOQ查询: table和joinTable都有id作为主键名称,但最终获取实体类包含joinTable的id和table的其余列。如果我重新排序表,结果相似,我有表的ID和joinTable的其余列。

  • 问题内容: 我有两个表,它们的列数是可变的。(我不知道有多少列或名称会是什么),例如表A和表B。 表A: 表B 询问: 当TableA和TableB都具有相同名称的列时,我无法区分两个不同的列。例如,两个表都有“名称”列,此查询将导致: 我正在寻找一种区分两个表的方法。最好使用预定义的列名称,例如。 我知道“ AS”关键字,但是问题是我不知道这些列名称将是什么。(我不知道TableA或TableB

  • 我在取消激发两个表之间的连接结果时遇到问题。这两个表定义为: 我想取消这一点,为每个ID/测试组合获取一行,以实现结果: 如果我在没有指定感兴趣的列的情况下编写unpivot,它看起来是这样的: 这会产生错误ORA-00918:列定义不明确 如果我尝试通过指定要使用的列来编写它,它看起来像这样: 这会产生错误ORA-01748:此处只允许使用简单的列名 有办法让这个unpivot工作吗?我可以将其

  • 当相应的列>0时,我需要将一些数据列设置为NA。 我也在考虑重塑,这样我就可以做一个变异。这里最好的做法是什么?

  • 我得到了一个表从SELECT查询1如下从SQL服务器: 我从SQL Server的SELECT query 2中获得了一个表,如下所示: 我想将这些SELECT查询加入到一个SELECT查询中,如下所示: 我试着这样: 但它不起作用,这不是我想要加入的实际表。 基本上,我想连接两个具有相同列名但它们之间没有公共值的SELECT查询。我想使用连接表中的SELECT查询。 提前谢谢你。

  • 问题内容: 我有两个表,它们的定义如下: 和这里代表。 我做了一个简单的本地SQL只能加入到选择和为: 但是我在行上遇到异常: 堆栈跟踪 : 您能建议出什么事了吗? 问题答案: 您需要设置结果别名。