我创建了这样的表:
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
)他们收到了。{/ p>
我尝试使用内部联接,左右联接,完全联接,查看来执行此操作,但没有成功。如果我有3门课程和2门考试,那么我会看到重复的事情。我想也许在我的数据库里出了问题。
答案 0 :(得分: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;