6

为简单起见,我将在这里将我的问题描述为理论问题。

想象一下,您有两张桌子—— 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);

那么,有什么想法吗?我只是不知道从这里去哪里。

4

2 回答 2

8

你离你想要的很近。您只需为具有相同名称的表和投影列定义唯一别名。

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;

在列名上添加别名的原因只是为了能够识别出谁是 fighter1 和 fighter2。

于 2013-03-24T10:28:35.520 回答
7

如果你加入两次,你必须给一个表起别名。否则数据库将不知道您指的是哪个表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

于 2013-03-24T10:28:18.890 回答