2012-05-12 41 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

您可以发布您正在使用的查询吗?这两门考试是针对单一课程的吗?在这个模式中这可能会导致你正在描述的行为。 –

+0

这是查询:选择utilisateur.nom,cour.c_nom,examen.ex_nom从 utilisateur留在 utilisateur.id_util = etude.fk_util留在 etude.fk_cour加入考尔一起练习曲= cour.id_cour留在 加入路人utilisateur.id_util = passer.fk_util左加入examen 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;