2

これは単なる大学の演習なので、急いでいるわけではありません。しかし、私はすでに答えを知りたいです。次のテーブルと行を検討してください。

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

私は知っています(私は試していないと思います)ユニオンとマイナスでそれを行うことができましたが、単一の選択でそれを行うことが可能かどうか知りたいです. クラッジせずにそれを行う方法について何か考えはありますか?

4

1 に答える 1

1

あなたのクエリにはほぼ正しい答えがありますが、検索は少し遠いと思います。「英語」で考えてみてください。

  1. コースがあります ( FROM course)
  2. 一部には前提条件があります ( LEFT JOIN prereq)
  3. 前提条件の名前が必要です ( LEFT JOIN course)

これはうまくいくはずです:

SELECT
    c1.nameco,
    c2.nameco AS nameprereq
FROM course AS c1
LEFT JOIN prereq AS p ON p.numcoprereq = c1.numco
LEFT JOIN course AS c2 ON c2.numco = p.numco
于 2012-11-25T01:37:02.977 に答える