2014-10-15 4 views
0

У меня есть это SQL заявление:ассоциировать две колонки вместе

select DISTINCT id_etudiant,g1.id_cours,note 
from etudiant NATURAL JOIN inscription NATURAL JOIN groupe g1,groupe g2 
where g1.id_cours = g2.id_cours 
group by id_etudiant,g1.id_cours,note 
having count(g1.id_cours) > 1 
order by id_etudiant asc 
; 

Что дает этот результат:

ID_ETUDIANT ID_COURS NOTE 
----------- ---------- ---- 
    1   8  E 
    2   1  A 
    2   2  A 
    2   3  B 
    3   1  B 
    3   1  E 
    3   2 
    3   3  B 
    8   8  E 
    8   8 

так что мой вопрос, как я могу получить этот результат, а?

ID_ETUDIANT ID_COURS  NOTE 
----------- --------  ---- 
    3    1  B 
    3    1  E 
    8    8  E 
    8    8 

я не хорошо, как задать вопрос, я сожалею об этом

+0

Возможно добавление 'WHERE id_etudiant IN (3,8)'. –

+0

Пожалуйста, сообщите нам, что соответствует строкам ожидаемого результата - почему они включены, а остальные строки исключены? – Turophile

+0

объясните нам данные, с которых вы начинаете, а затем объясняете (слова, а не код действительно), что вы пытаетесь закончить. таких как ... почему не 'A' вернулся? –

ответ

0

Так из ваших ответов в комментариях, я полагаю, вы хотите строки, где Etudiant имеет те же Курица несколько раз ,

Я думаю, что проблема с запросом у вас в том, что он содержит примечание. Попробуйте упрощенную версию:

select DISTINCT id_etudiant,g1.id_cours 
from etudiant NATURAL JOIN inscription NATURAL JOIN groupe g1,groupe g2 
where g1.id_cours = g2.id_cours 
group by id_etudiant,g1.id_cours 
having count(g1.id_cours) > 1 
order by id_etudiant asc 
; 

Если он дает правильные строки, а затем добавить примечание назад в конце:

select table1.id_etudiant, table1.id_cours, table2.note 
from ( 
select DISTINCT id_etudiant,g1.id_cours 
from etudiant NATURAL JOIN inscription NATURAL JOIN groupe g1,groupe g2 
where g1.id_cours = g2.id_cours 
group by id_etudiant,g1.id_cours 
having count(g1.id_cours) > 1 
) as table1, 
left outer join inscription as table2 
on table1.id_etudiant = table2.id_etudiant and table1.id_cours = table2.id_cours 
order by id_etudiant, id_cours 
; 

Это было бы проще, если бы образец структуры таблиц и данных для работы с ,

+0

Привет, пользователь3380481, вы приняли этот ответ, но, пожалуйста, обратите внимание на комментарий выше от @a_horse_with_no_name. Я бы не написал этот запрос так, как вы его делали, но оставил его в основном без изменений в моем ответе, поэтому было бы ясно, что я добавил, чтобы получить требуемый результат. – Turophile

0

Начиная с исходного запроса (я пропустил DISTINCT, потому что это не nessessary) и в предположении, что вы хотите только строки с одинаковым étudiant и Курами, но разными нотами, этот запрос может помочь вам:

SELECT id_etudiant, id_cours, note 
    FROM(
    SELECT id_etudiant, g1.id_cours, note, 
      COUNT(*) OVER (PARTITION BY id_etudiant, g1.id_cours) cnt 
     FROM etudiant 
    NATURAL 
     JOIN inscription 
    NATURAL 
     JOIN groupe g1, groupe g2 
     WHERE g1.id_cours = g2.id_cours 
     GROUP 
     BY id_etudiant, g1.id_cours, note 
    HAVING COUNT(g1.id_cours) > 1 
    ) 
WHERE cnt > 1  
ORDER 
    BY id_etudiant ASC; 
0

Использование COUNT() OVER(), как это:

select 
     ID_ETUDIANT, ID_COURS, NOTE 
from (
     select 
       ID_ETUDIANT, ID_COURS, NOTE 
      , COUNT(*) OVER(PARTITION BY ID_ETUDIANT, ID_COURS) as x 
     from existing_query 
    ) 
where x > 1 

Который будет производить:

| ID_ETUDIANT | ID_COURS | NOTE | 
|-------------|----------|--------| 
|   3 |  1 |  B | 
|   3 |  1 |  E | 
|   8 |  8 |  E | 
|   8 |  8 | (null) | 
Смежные вопросы