2012-03-06 78 views
5

我有這個表如何檢索oracle中發生兩次以上的記錄?

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

你想只服從於選擇,對不對?只有在stu_id,s_Name重複時纔有重複,對嗎?如果是這樣,你想得到哪個科目?有不止一個... – 2012-03-06 11:25:16

回答

19

這是因爲沒有一個學生每個科目有多個記錄。

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject 
having count(stu_id) >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行。謝謝。 – 2012-03-06 11:39:41

0

由於您按表格中的所有列進行分組,因此它將生成唯一行(具有一個頻率行的記錄)。由於您已經選擇了多於2個的行,因此它將不具有頻率爲2的記錄。 如果你會做計數= 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