2012-05-12 2 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 экзамена против одного курса? Это было бы возможно в этой схеме и могло бы вызывать поведение, которое вы описываете. –

+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 left join 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; 

Редактировать: Это было немного сложнее, чем это мне впервые показалось, я добавил новое решение ниже. Первое, что я сделал, это добавить некоторые псевдонимы в запрос, есть проблема с тем, что ansi объединяется между 3 или более таблицами, если вы не используете псевдонимы для определенных версий oracle. Псевдонимы, как правило, хорошие, я добавил их в любом случае. Я также переместил некоторые из таблиц в встроенные представления, чтобы сделать проблему более ясной для себя, как и все. Помимо этого прибирать, единственное реальное изменение, которое я сделал, чтобы добавить эту строку: -

И 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; 
Смежные вопросы