これは単なる大学の演習なので、急いでいるわけではありません。しかし、私はすでに答えを知りたいです。次のテーブルと行を検討してください。
create table course (
numco integer,
nameco varchar(20) not null,
primary key (numco)
);
create table prereq (
numco integer,
numcoprereq integer,
primary key (numco, numcoprereq),
foreign key (numco) references course (numco),
foreign key (numcoprereq) references course (numco)
);
insert into course values (1, 'course 1');
insert into course values (2, 'course 2');
insert into course values (3, 'course 3');
insert into course values (4, 'course 4');
insert into course values (1, 'course 5');
insert into course values (2, 'course 6');
insert into prereq values (4, 2);
insert into prereq values (2, 1);
私はこれを作りませんでした。私はちょうどそれを翻訳し、いくつかの無関係なビットを削除しました. 同じ PK の行が 2 つあることは知っていcourse
ますが、これについては先生に尋ねなければなりません。
彼は、コースの名前とコースの前提条件の名前を取得するためのクエリを作成するように私たちに依頼しました。コース番号のみの場合は、左結合でうまくいきます。しかし、私は名前でそれを機能させることはできません。次のように出力されます。
course 1 (null)
course 2 course 1
course 3 (null)
course 4 course 2
course 5 (null)
course 6 course 1
私はたくさん検索し、2つの試みを書きました:
select C1.nameco, C2.nameco as namecoprereq
from course C2 left join
(course C1 join prereq P on C1.numco = P.numco)
on C2.numco = P.numcoprereq;
select C1.nameco, C2.nameco as namecoprereq
from (course C1 join prereq P on C1.numco = P.numco)
left join course C2 on C2.numco = P.numcoprereq;
それぞれ次のように出力します。
course 2 course 1
course 6 course 1
course 4 course 2
(null) course 3
(null) course 4
course 2 course 5
course 6 course 5
course 4 course 6
と
course 2 course 1
course 2 course 5
course 4 course 2
course 4 course 6
course 6 course 1
course 6 course 5
私は知っています(私は試していないと思います)ユニオンとマイナスでそれを行うことができましたが、単一の選択でそれを行うことが可能かどうか知りたいです. クラッジせずにそれを行う方法について何か考えはありますか?