父表中的两个外键引用同一个子表。如何构造 INNER JOIN?
Posted
技术标签:
【中文标题】父表中的两个外键引用同一个子表。如何构造 INNER JOIN?【英文标题】:Two foreign keys in parent table reference same child table. How to structure INNER JOIN? 【发布时间】:2013-03-24 10:22:58 【问题描述】:为简单起见,我将在这里将我的问题描述为理论问题。
假设您有两张桌子—— MATCHES 和 FIGHTERS。 'Fighters' 有一个战斗机列表(pk_fighter_id, fighter_name),其中任何两个都可以安排互相对打。 “匹配”可能是一个三字段表(pk_fight_num、fk_fighter_id1、fk_fighter_id2),它跟踪这些配对。 Fighter1 和 Fighter2 是引用 Fighters 表中条目的外键。
我需要获取所有战斗的列表,显示谁在战斗谁,即“23123 | Pacquaio | Marquez”。不过,我到底该如何构建我的查询呢?
我想像这样:
select fk_fighter_id1, fk_fighter_id2
from matches
inner join fighters on matches.fk_fighter_id1=fighters.pk_fighter_id
inner join fighters on matches.fk_fighter_id2=fighters.pk_fighter_id;
当我尝试在 Access 中模拟它时,我将它拼凑在一起,但它不起作用:
SELECT matches.match_no, fighters.fighter_name, fighters.fighter_name
FROM fighters
INNER JOIN matches ON (fighters.fighter_id = matches.fighter2) AND (fighters.fighter_id = matches.fighter1);
那么,有什么想法吗?我只是不知道从这里去哪里。
【问题讨论】:
【参考方案1】:你已经接近你想要的了。您只需要为具有相同名称的表以及投影列定义一个唯一的别名。
select a.pk_fight_num,
b.fighter_name firstFighter, -- <<== needed also
c.fighter_name secondFighter -- <<== needed also
from matches a
inner join fighters b
on a.fk_fighter_id1 = b.pk_fighter_id
inner join fighters c
on a.fk_fighter_id2 = c.pk_fighter_id;
之所以在列名上加上别名,只是为了能够识别出谁是战士1和战士2。
【讨论】:
【参考方案2】:如果你加入两次,你必须给一个表加上别名。否则数据库将不知道您使用fighters
表示哪个表。例如:
select *
from matches m
inner join fighters f1 on m.fk_fighter_id1 = f1.pk_fighter_id
inner join fighters f2 on m.fk_fighter_id2 = f2.pk_fighter_id
fighters
的第一个连接别名为f1
,第二个连接别名为f2
。
【讨论】:
我只能标记一个最佳答案,并且没有足够的代表来投票给您,但感谢您的参与!以上是关于父表中的两个外键引用同一个子表。如何构造 INNER JOIN?的主要内容,如果未能解决你的问题,请参考以下文章