6

簡単にするために、ここでは私の問題を理論として説明します。

MATCHESとFIGHTERSの2つのテーブルがあるとします。「ファイターズ」にはファイターのリスト(pk_fighter_id、fighter_name)があり、そのうちの2つは互いにスパーするようにスケジュールできます。「一致」は、おそらくこれらのペアリングを追跡する3フィールドテーブル(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

テーブルを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、2番目はにエイリアスされf2ます。

于 2013-03-24T10:28:18.890 に答える