2015-08-21 40 views
4

查詢應返回Naveed Rizwan Fayaz和Ahmed Name。SQL查詢以獲得已註冊英語或烏爾都語課程的學生,但不在

針對註冊了英語或烏爾都語課程但不是兩者都具備的學生的SQL查詢。

declare @Student table(sid int identity(1, 1), sname varchar(250)) 
declare @Course table(cid int identity(1, 1), cname varchar(250)) 

declare @StudentCourse table(cid int, sid int) 
insert into @Student(sname) 

select 'Mehboob' union all --1 
select 'Rahim' union all -- 2 
select 'Naveed' union all --3 
select 'Rizwan' union all --4 
select 'Fayaz' union all --5 
select 'Ahmed' -- 6 

insert into @Course(cname) 
select 'English' union all 
select 'Urdu' 


insert into @StudentCourse(sid ,cid) 
select 1,1 union all 
select 2,1 union all 
select 3,1 union all 
select 4,1 union all 
select 5,2 union all 
select 6,2 union all 
select 1,2 union all 
select 2,2 
+0

而預期的結果是什麼? –

+0

查詢應該返回Naveed Rizwan Fayaz和Ahmed Name。 –

回答

1
select sid, max(cid) 
from StudentCourse 
group by sid 
having count(*)=1 
+0

這就是一個精確的查詢謝謝你 –

2

我一直在練習,最後我通過這個查詢做到了,你們有沒有其他的想法。

select 
    s.*, count(1) as TotalEnrolledCourses 
from 
    @Student s 
inner join 
    @StudentCourse sc on s.sid = sc.sid 
where 
    sc.cid in (1,2) 
group by 
    s.sid, sname 
having 
    TotalEnrolledCourses = 1 
+0

這應該是'HAVING count(1)= 1'。 –

+0

糾正我,如果我錯了,但不是條件'sc.cid in(1,2)'_not_ an XOR ...意思是指課程1或課程2? –

+0

是的,這意味着課程1或課程2 –

0

只是另一種方式來解決問題:

SELECT 
    s.sid, 
    s.sname 
FROM @StudentCourse sc 
INNER JOIN @Student s 
    ON s.sid = sc.sid 
WHERE 
    sc.cid IN(1, 2) 
GROUP BY 
    s.sid, s.sname 
HAVING 
    (
     SUM(CASE WHEN sc.cid = 1 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN sc.cid = 2 THEN 1 ELSE 0 END) 
    ) = 1 
1

從這裏可以得到學生的完整信息與一個註冊課程即名稱和ID等

SELECT s.* 
FROM Student s 
INNER JOIN (select sid, max(cid) 
      from StudentCourse 
      group by sid 
      having count(*)=1 
      ) sc ON s.sid=sc.sid 
+0

我也喜歡這種方法。非常感謝 –

相關問題