Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从同一个表中选择唯一元组_Sql_Database_Oracle - Fatal编程技术网

Sql 如何从同一个表中选择唯一元组

Sql 如何从同一个表中选择唯一元组,sql,database,oracle,Sql,Database,Oracle,我想找到所有在两个或两个以上部分注册的不同学生对 注册SID*,等级,dname*,cno*,部门号* 如果每个节由dname*、cno*、sectno*唯一标识,则可以在标识节的列上进行自联接,并指定e1.sid

我想找到所有在两个或两个以上部分注册的不同学生对

注册SID*,等级,dname*,cno*,部门号*


如果每个节由dname*、cno*、sectno*唯一标识,则可以在标识节的列上进行自联接,并指定e1.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
但是,如果一个sid在同一节上注册多次,则此查询将无法正常工作

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
使用行号

如果一个sid在同一节上注册多次,则此查询将正常工作

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
如果需要,可以使用distinct

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
输出


但我想让这对学生一起参加2个或更多的课程。上面的查询给出了在一个节中注册的一对together@anvitapotluri请参阅更新,而不是使用组和
>        SID
> ----------
>          1
>          2
>          3