连接两个共享多对一关系的 SQL 表

Posted

技术标签:

【中文标题】连接两个共享多对一关系的 SQL 表【英文标题】:Joining Two SQL Tables That share a many to one Realtionship 【发布时间】:2015-09-08 15:27:05 【问题描述】:

您好,我有两张表,一张名为 Team,另一张名为 Schedule

Schedule 表具有以下属性:idawayhomedate... 其中 away 和 home 是 Team 表的外键。

Team 表具有以下属性:nameid

我的目标是加入 Team 和 Schedule,以便 schedule.id、away、awayTeamName、home、homeTeamName、date 都在同一个查询中。这就是我目前所拥有的

SELECT  `GAME_ID` ,  `AWAY` , TEAM.NAME AS awayName,  `HOME`,  `LEVEL` , 
`LOCATION` ,  `DATE` 
FROM SCHEDULE
INNER JOIN TEAM ON SCHEDULE.AWAY = TEAM.TEAM_ID
OR SCHEDULE.HOME = TEAM.TEAM_ID

我得到的输出是这样的

GAME_ID | AWAY | awayName | HOME | LEVEL | LOCATION | DATE
1       | 2    |  name1   | 3    |varsity| @home    | 06/22/2015

但我希望它看起来像这样

GAME_ID | AWAY | awayName | HOME | homeName| LEVEL | LOCATION | DATE
1       | 2    |  name2   | 3    | name3   |varsity| @home    | 06/22/2015

如果有人能帮忙,我将不胜感激

【问题讨论】:

您需要另一个带有Team 表的INNER JOIN(使用不同的别名)。 你能提供数据吗?您只显示了您想要的结果,但您的源数据丢失了。 【参考方案1】:

您可以拥有多个联接。

SELECT  SCHEDULE.GAME_ID , away.AWAY, away.NAME AS awayName, home.HOME , home.NAME AS homeName, LEVEL , 
LOCATION , DATE 
FROM SCHEDULE
INNER JOIN TEAM as away ON SCHEDULE.AWAY = TEAM.TEAM_ID INNER JOIN TEAM as home ON
SCHEDULE.HOME = TEAM.TEAM_ID

会是这样的。

【讨论】:

【参考方案2】:
 INNER JOIN TEAM as home ON SCHEDULE.HOME = TEAM.TEAM_ID

将此添加到查询的末尾,这会为您提供两个完全合法的内部连接。

当您将来有两个以上的表要处理时,您应该会发现这很有用。

inner joins on more than 2 table

【讨论】:

以上是关于连接两个共享多对一关系的 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

针对多对一关系优化 SQL 查询

模板中具有多对一关系的Django模型

将多个文件发布到数据库 - 多对一关系的空值

MyBatis之多对一关系

Hibernate 多对一关联查询

一对多和多对一关系的区别