1
create table people(
  id_pers int,
  nom_pers char(25),
  d_nais date,
  d_mort date,
  primary key(id_pers)
);

create table event(
  id_evn int,
  primary key(id_evn)
);

create table assisted_to(
  id_pers int,
  id_evn int,
  foreign key (id_pers) references people(id_pers),
  foreign key (id_evn) references event(id_evn)
);

insert into people(id_pers, nom_pers, d_nais, d_mort) values (1, 'A', current_date - integer '20', current_date);
insert into people(id_pers, nom_pers, d_nais, d_mort) values (2, 'B', current_date - integer '50', current_date - integer '20');
insert into people(id_pers, nom_pers, d_nais, d_mort) values (3, 'C', current_date - integer '25', current_date - integer '20');

insert into event(id_evn) values (1);
insert into event(id_evn) values (2);
insert into event(id_evn) values (3);
insert into event(id_evn) values (4);
insert into event(id_evn) values (5);

insert into assisted_to(id_pers, id_evn) values (1, 5);
insert into assisted_to(id_pers, id_evn) values (2, 5);
insert into assisted_to(id_pers, id_evn) values (2, 4);
insert into assisted_to(id_pers, id_evn) values (3, 5);
insert into assisted_to(id_pers, id_evn) values (3, 4);
insert into assisted_to(id_pers, id_evn) values (3, 3);

特定の日に同じイベントを手伝ったカップルを見つける必要があります。

私は試した:

select p1.id_pers, p2.id_pers from people p1, people p2, assisted_event ae
where ae.id_pers = p1.id_pers
and   ae.id_pers = p2.id_pers

しかし、0行を返します。

私は何を間違っていますか?

4

3 に答える 3

2

これを試して:

 select distint ae.id_evn, 
    p1.nom_pers personA, p2.nom_pers PersonB
 from assieted_to ae
     Join people p1 
        On p1.id_pers = ae.id_pers 
     Join people p2 
        On p2.id_pers = ae.id_pers
           And p2.id_pers > p1.id_pers

これにより、同じイベントで支援した人々 [カップル] のすべてのペアが生成されます。あなたのスキーマでは、同じ日に支援した場合に結果を制限する方法はありません。彼らが同じイベントを支援した場合、そのイベントは 1 日にしか発生しなかった可能性があると想定されます。

于 2013-06-08T01:48:43.320 に答える
2

2 人の人物を選択すると、2 つの行も選択する必要があります。これは、各人物がテーブルassisted_eventに独自の割り当て行を持っているためです。アイデアは、同じ行を共有する行のペアの間およびそれを介しassisted_eventてリンクを構築することですp1p2assisted_eventid_evn

select p1.id_pers, p2.id_pers
from people p1, people p2
where exists (
    select *
    from assisted_event e1
    join assisted_event e2 on e1.id_evn=e2.id_evn
    where e1.id_pers=p1.id_pers and e2.id_pers=p2.id_pers
)
于 2013-06-08T01:49:43.483 に答える
1

読めるように ANSI JOIN 構文に言い換えると、クエリは次のようになります。

select p1.id_pers, p2.id_pers
from assisted_event ae
inner join people p1 ON (ae.id_pers = p1.id_pers)
inner join people p2 ON (ae.id_pers = p2.id_pers)

id_persは の主キーであるため、 が と と同時に等しくなることはありp1ません。別のアプローチを見つける必要があります。ae.id_persp1.id_persp2.id_pers

このために参加する必要はまったくありませんがpeople、詳細を入力するために参加することをお勧めします。目的の結果を得るには、人物テーブルではなく、人物とイベントの結合テーブルを自己結合する必要があります。自己結合をフィルタリングして、イベント ID は同じであるが人物が異なる行のみを含めます。>ではなくを使用<>すると、別のパスを使用して(a,b)vs(b,a)ペアリングを除外する必要がなくなります。

何かのようなもの:

select ae1.id_evn event_id, ae1.id_pers id_pers1, ae2.id_pers id_pers2
from assisted_to ae1
  inner join assisted_to ae2 
  on (ae2.id_evn = ae1.id_evn and ae1.id_pers > ae2.id_pers)

event必要に応じて、およびpersionテーブルに結合を追加して、詳細を設定できるようになりました。2 つの異なる「サイド」にデータを入力するには、異なるエイリアスを持つ人々に 2 回参加する必要があります。Charles Bretana の例を参照してください。

于 2013-06-08T01:46:45.090 に答える