web-dev-qa-db-ja.com

Oracleで2回以上発生したレコードを取得するにはどうすればよいですか?

私はこのテーブルを持っています

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

そのため、2回以上発生したレコードを取得する必要がありました。私のコードは

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 ;
9
Ashish dmc4

それは、あなたの生徒の誰もが主題ごとに複数のレコードを持っていないからです。

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

このコードは、同じ学生ID、名前、件名を持つ2回以上発生するレコードを要求します。サンプル内のどのレコードもこれを満たしていません。

ただし、実際に必要なのが3つ以上のクラスを受講している生徒のID、名前、および科目である場合、これは非常に簡単に実行できます。

最初の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 );

お役に立てれば。

26
John N

テーブルに存在するすべての列でグループ化しているため、一意の行(1つの頻度行を持つレコード)が生成されます。すでに2を超える行を選択しているため、頻度2のレコードはありません。 = 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
0
user1082916