2012-03-06 4 views
5

私は、この表にoracleで2回以上発生したレコードを取り出す方法は?

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

ので、私が3回以上発生しているレコードを取得したいデータとして

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

とこれを持っています。私のコードは

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

です。結果は完璧でした。

しかし、私がs_subjectを望むとき、それは選択された行がないと言います。どうしてか分かりません。

+2

あなたは右、唯一の選択で対象としたいですか?複製は、stu_id、s_Nameが複製されている場合にのみ有効です。もしそうなら、どの科目を取得したいですか? 2つ以上があります... –

答えて

19

あなたの生徒には1件につき1件につき1件以上のレコードがないからです。

このコードでは、生徒ID、名前、件名が同じで、2回以上発生したレコードが必要です。あなたのサンプルのどのレコードもこれを満たしません。

実際に欲しいのは、2つ以上のクラスを受講している生徒の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); 

は、この情報がお役に立てば幸いです。

+0

実際には、INを使用する代わりに、1行以上返されたサブクエリを使用していました。ありがとうございます。 –

0

すべての列でグループ化すると、一意の行(1つの頻度行のレコード)が生成されます。2を超える行を選択すると、頻度2のレコードはありません。 Ifあなたは、カウント= 1で行います、あなたがカウントはすべての行を取得する= 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 
関連する問題