4

私は次のようなテーブルを作成しました:

create table utilisateur(
 id_util number(10) primary key,
 nom varchar2(10) not null,
 prenom varchar2(10) not null,
 date_naissance date not null,
 adress varchar2(20)
);

create table cour(
 id_cour number(10) primary key,
 c_nom varchar2(20) not null,
 auteur varchar2(20) not null
);

create table etude(
 fk_util number(10) references utilisateur(id_util),
 fk_cour number(10) references cour(id_cour),
 primary key(fk_util,fk_cour)
);

create table examen(
 id_ex number(10) primary key,
 ex_nom varchar2(20) not null,
 temp date,
 fk_cour number(10) references cour(id_cour)
);

create table passer(
 fk_util number(10) references utilisateur(id_util),
 fk_ex number(10) references examen(id_ex),
 primary key(fk_util,fk_ex),
 note number(4)
);

create table certificat(
 cert_nom varchar2(20),
 prix varchar2(10),
 code varchar2(10) primary key,
 fk_ex number(10),
 fk_util number(10)
);

create table signet(
 id_sign number(10) primary key,
 s_nom varchar2(20) not null,
 depand_par varchar2(20) not null,
 fk_util number(10) references utilisateur(id_util)
);

問題は、すべてのユーザー( )、読んでいるutilisateurコース( )、合格した試験()、受け取った証明書( )を確認したいということです。courexamencertificat

内部結合、左右結合、完全結合、表示を使用してこれを実行しようとしましたが、成功しませんでした。3つのコースを登録し、2つの試験がある場合、何かが繰り返されるのがわかります。データベースに何か問題があるのではないかと思っています。

ここに画像の説明を入力してください

4

1 に答える 1

1

このクエリ

select utilisateur.nom
       , cour.c_nom
       , examen.ex_nom
from utilisateur left join etude on utilisateur.id_util=etude.fk_util 
left join cour on etude.fk_cour=cour.id_cour 
left join passer on utilisateur.id_util=passer.fk_util 
left join examen on passer.fk_ex=examen.id_ex;

試験がコースに関連しているという事実を考慮していません。あなたが達成しようとしていることのために外部結合を行う必要はないと思うので、これを試してください。

select utilisateur.nom
     , cour.c_nom
     , examen.ex_nom
from utilisateur join etude on utilisateur.id_util=etude.fk_util 
                 join cour on etude.fk_cour=cour.id_cour 
                 join passer on utilisateur.id_util=passer.fk_util 
                 join examen on cour.id_cour = examen.fk_cour;

編集:これは私が最初に思ったよりも少し複雑でした。以下に新しいソリューションを追加しました。私が最初にしたことは、クエリにいくつかのエイリアスを追加することでした。特定のバージョンのOracleでエイリアスを使用しない場合、3つ以上のテーブル間でansi結合を実行する際に問題が発生します。エイリアスは一般的に良いものですが、とにかくそれらを追加しました。また、問題を何よりも明確にするために、いくつかのテーブルをインラインビューに移動しました。この片付けを除いて、私が行った唯一の本当の変更は、この行を追加することです:-

AND paex.id_ex = coex.id_ex

私はあなたが説明したように私が作成したいくつかのデータに対してこのクエリをテストしました、そしてそれはあなたが望むことをするようです。

    SELECT ut.id_util
  ,ut.nom
  ,coex.c_nom
  ,paex.id_ex
  ,paex.ex_nom FROM   utilisateur ut LEFT JOIN (SELECT c_nom
             ,ex_nom
             ,co.id_cour
             ,id_ex 
             ,et.fk_util               
       FROM etude et JOIN cour co ON et.fk_cour = co.id_cour
                LEFT JOIN examen ex2 ON co.id_cour = ex2.fk_cour) coex ON coex.fk_util = ut.id_util LEFT JOIN (SELECT *
       FROM passer pa JOIN examen ex  ON pa.fk_ex   = ex.id_ex) paex ON paex.fk_util = ut.id_util 
                                                                    AND paex.id_ex = coex.id_ex ORDER BY id_util;
于 2012-05-13T18:31:01.760 に答える