как извлечь записи, которые произошли более двух раз в оракуле? - PullRequest
9 голосов
/ 06 марта 2012

У меня есть эта таблица

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

и это как данные

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';

, поэтому я хотел получить записи, которые произошли более двух раз.мой код

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

результат был идеальным.

, но когда я хочу s_subject, он говорит, что строки не выбраны.Я не знаю почему.

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

Ответы [ 2 ]

25 голосов
/ 06 марта 2012

Это потому, что ни один из ваших студентов не имеет более одной записи по предмету.

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

Этот код запрашивает записи, которые встречаются более двух раз с одинаковым идентификатором ученика, именем и темой. Ни одна из записей в вашем образце не соответствует этому.

Если, однако, то, что вам на самом деле нужно, это удостоверение личности, имя и предметы любого ученика, который посещает более двух классов, это можно сделать довольно легко.

Используя слегка измененную версию вашего исходного SQL в качестве фильтра, мы получаем это:

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 );

Надеюсь, это поможет.

0 голосов
/ 06 марта 2012

Поскольку вы группируете по всем столбцам, существующим в таблице, он будет генерировать уникальные строки (запись с одной частотной строкой). Поскольку вы уже выбираете строки, имеющие более 2, у них не будет записей с частотой 2. Если вы будетесделать с count = 1, вы получите все строки с count = 1,

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

Вывод будет:

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
...