web-dev-qa-db-fra.com

comment récupérer des enregistrements qui se sont produits plus de deux fois dans Oracle? 

J'ai cette table

create table student (
   stu_id int,
   s_name nvarchar(max),
   s_subject nvarchar(max),
)

et ceci comme données

insert into student values(123,'pammy','English');
insert into student values(123,'pammy','Maths');
insert into student values(123,'pammy','Chemistry');
insert into student values(124,'watts','Biology');
insert into student values(125,'Tom','Physics');
insert into student values(125,'Tom','Computer';
insert into student values(125,'Tom','ED';

je voulais donc récupérer les enregistrements qui se sont produits plus de deux fois. mon code est

select stu_id,s_Name 
from student 
group by stu_id,s_Name 
having count(stu_id) >2 ;

le résultat était parfait.

mais quand je veux s_subject, il ne dit pas non plus de lignes sélectionnées. Je ne sais pas pourquoi.

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject 
having count(stu_id) >2 ;
9
Ashish dmc4

C'est parce qu'aucun de vos étudiants n'a plus d'un enregistrement par matière.

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject 
having count(stu_id) >2 ;

Ce code demande que les enregistrements qui se produisent plus de deux fois aient le même ID d'étudiant, le même nom et le même sujet. Aucun des enregistrements de votre échantillon ne correspond à cela.

Si, toutefois, vous voulez réellement l’identité, le nom et les sujets de tout étudiant qui suit plus de deux cours, cela peut être fait assez facilement.

En utilisant une version légèrement modifiée de votre code SQL initial en tant que filtre, nous obtenons ceci:

select stu_id, name, subject
from student
where stu_id in (   select stu_id 
                    from student 
                    group by stu_id 
                    having count(stu_id) >2 );

J'espère que cela t'aides.

24
John N

Comme vous regroupez toutes les colonnes existantes dans la table, il générera des lignes uniques (enregistrement avec une ligne de fréquence). faire avec nombre = 1, vous obtiendrez toutes les lignes avec nombre = 1,

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject
having count(stu_id) =1 ;

La sortie sera:

stu_id      s_Name      s_subject
   ----------- -------------
123         pammy       Chemistry
123         pammy       English
123         pammy       Maths
124         watts       Biology
125         Tom         Computer
125         Tom         ED
125         Tom         Physics
0
user1082916