2014-10-12 3 views
-3

Я хочу, чтобы найти все пары diffrent студентов, которые обучаются в двух или более секций вместе скак выбрать уникальные наборы из одной таблицы

регистрируется (с.и.д. *, класс, DNAME *, CNO *, номер-раздела *)

, где каждая секция однозначно идентифицируется (Dname *, CNO *, *) номер-раздела

ответ

3

Вы можете самостоятельно присоединиться к столбцам, которые идентифицируют секцию и указать e1.sid < e2.sid для выборки каждой пары студентов только один раз.

select e1.sid, e2.sid from enroll e1 
join enroll e2 on e1.dname = e2.dname 
and e1.cno = e2.cno 
and e1.secno = e2.sectno 
where e1.sid < e2.sid 
group by e1.sid, e2.sid 
having count(*) > 1 
+0

, но я хочу пару sudents быть зачисленным в 2-х или более секций вместе. приведенный выше запрос дает пару, зарегистрированную в одном разделе вместе –

+0

@anvitapotluri см. обновление, вместо 'distinct' use' group by' и 'having' – FuzzyTree

1
/* 
with enroll as (
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 2 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 3 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 2 cno, 2 secno from dual union all 
select 2 sid, 'dname' dname, 2 cno, 2 secno from dual 
) 
*/ 
select e1.sid, e2.sid from enroll e1 
join enroll e2 on e1.dname = e2.dname 
and e1.cno = e2.cno 
and e1.secno = e2.secno 
where e1.sid < e2.sid 
group by e1.sid, e2.sid 
having count(*) >= 2; 

(Но этот запрос не будет работать правильно, если один с.и.д. поступил в тот же раздел более чем один раз)

1
with enroll as (
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 2 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 3 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 3 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 2 cno, 2 secno from dual union all 
select 2 sid, 'dname' dname, 2 cno, 2 secno from dual 
) 
select rn,sid from (
select row_number() over (partition by sid order by dname) as rn ,sid 
from enroll) 
where rn>1 

использовать row_number()

этого запроса работайте правильно, если один сид зарегистрирован на той же секции более одного раза


различны могут быть использованы при необходимости

with enroll as (
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 2 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 3 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 3 sid, 'dname' dname, 1 cno, 1 secno from dual union all 
select 1 sid, 'dname' dname, 2 cno, 2 secno from dual union all 
select 4 sid, 'dname' dname, 2 cno, 2 secno from dual union all 
select 2 sid, 'dname' dname, 2 cno, 2 secno from dual 
) 
select distinct sid from (
select row_number() over (partition by sid order by dname) as rn ,sid 
from enroll) 
where rn>1 

Выходной

>  SID 
> ---------- 
>   1 
>   2 
>   3 
Смежные вопросы