【问题标题】:Join table A into table B multiple times将表 A 多次连接到表 B
【发布时间】:2019-08-23 08:34:48
【问题描述】:

我在 mysql 数据库中有 2 个表(简化示例数据):

Table 1: 3 names (unique)
Table 2: names (only from table 1), 3 dates, info

对于每个日期,有时表 2 中的所有 3 个名称,有时少于 3 个。

表 2 示例:

d1 n1 info
d1 n2 info
d1 n3 info
d2 n1 info
d2 n3 info
d3 n3 info

日期 1 有 3 个名字,日期 2 有 2 个名字,日期 3 有 1 个名字。

目标:我需要每个“日期”包含所有 3 个名称。我已经可以从表 2 中过滤 1 个日期并成功加入这些表以获得一个日期的预期结果,但是如何将所有名称“添加”到每个日期?

d1 n1 info
d1 n2 info
d1 n3 info
d2 n1 info
d2 n2 (added by the join, "info" is empty)
d2 n3 info
d3 n1 (added by the join, "info" is empty)
d3 n2 (added by the join, "info" is empty)
d3 n3 info

我的真实数据有更多的名称和日期,这使得单独的连接变得不切实际。感觉应该有一个简单的解决方案,但我找不到任何解决方案。

我也可以用代码来做到这一点(“为每个日期添加缺失的名字”),但我想知道它是否可以用 sql 来完成

使用 MySQL 10.1.37

【问题讨论】:

  • 我是否理解正确,您希望我举一个我已经可以做的上述连接的例子?
  • 不,我不希望你做任何你不喜欢的事情。但是,如果您愿意,您可能希望阅读提供的链接中已接受答案中的信息并采取行动。
  • @david 什么是“加入”?如果名称-日期对不存在匹配记录,信息列将包含什么?
  • @SalmanA 对于新添加的名称,信息列将为空;我只需要表 2 来包含每个日期的每个名称;新添加的名称没有任何信息(还)
  • @Strawberry 感谢您的意见。我不确定您是否真的认为我的示例数据上的 CREATE 和 INSERT 语句是必要的,因为它们的结构过于简单。我只是想仔细检查一下我是否理解正确。

标签: mysql sql outer-join


【解决方案1】:

使用CROSS JOIN 创建所有可能的姓名和日期组合,后跟LEFT JOIN

SELECT name_table.name, datelist.date, info_table.info
FROM name_table
CROSS JOIN (SELECT DISTINCT date FROM info_table) AS datelist
LEFT JOIN info_table ON name_table.name = info_table.name AND datelist.date = info_table.date

【讨论】:

  • 这听起来很像我正在寻找的东西,现在就试试吧。
猜你喜欢
  • 1970-01-01
  • 2015-09-19
  • 2021-03-16
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多