2012-05-12 36 views
4

を動作していないジョイン:SQLクエリは、私はこのようなテーブルを作成し

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)、ウィッヒコース(courを)見たいというウィッヒの試験です(examen)彼らは合格し、どの証明書(certificat)を受け取ったのですか。

私は内側の結合、左と右の結合、完全な結合、表示、しかし成功なしでこれをしようとしました。登録された3つのコースと2つの試験があれば、何かが繰り返されるのを見るよりも。私のデータベースでは何かが間違っていると思っています。

enter image description here

+1

使用しているクエリを投稿できますか? 2つの試験は1つのコースに対して行われますか?これはこのスキーマで可能であり、記述している動作を引き起こしている可能性があります。 –

+0

これはクエリです: utilisateur.id_util = etude.fk_util etude.fk_courにクールに参加し、左側の練習曲に参加左utilisateur から選択utilisateur.nom、cour.c_nom、examen.ex_nom = cour.id_courは で通行人に参加左utilisateur.id_util = passer.fk_util left join examen on passer.fk_ex = examen.id_ex; –

答えて

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ジョインを行う際に問題が発生します。エイリアスは一般的には良いことですが、とにかくエイリアスを追加しました。また、テーブルの一部をインラインビューに移動して、問題を自分自身にとってより明確にするようにしました。これとは別に片付け、私が作った唯一の真の変化は、この行を追加することです: - 私は私のように作成したいくつかのデータに対してこのクエリをテストしてみた

と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;