2014-01-18 64 views
1

我正在努力研究如何在MSSQL中完成以下查詢。返回參加同班學生的學生名單

  • 我有一個類的列表。
  • 我有一個學生名單。
  • 我有類的列表,學生參加(此表有兩個A級和學生的關係)

我怎樣才能返回兩個學生和他們一起參加任何課程的列表?例如。

+-----------+------------+------------+ 
|Student1 | Student2 | Class Name | 
+-----------+------------+------------+ 
|John Smith | Jane Doe | Trig  | 
+-----------+------------+------------+ 
|John Smith | Jane Smith | Math  | 
+-----------+------------+------------+ 
+0

什麼是您未來的查詢輸入? –

+0

理想情況下,如果我可以讓所有回到課堂的學生一起上課,那麼沒有理由。但是,可以選擇提供student1和student2。 – endyourif

回答

3

您可以用自聯接做到這一點:

select c1.student, c2.student, c1.class 
from ClassStudents c1 join 
    ClassStudents c2 
    on c1.class = c2.class and 
     c1.student < c2.student; 

如果兩個學生參加多類在一起,這將每類返回一行。

如果您在表中使用id s而不是名稱(一個好主意),那麼您需要加入其他表的相應信息。我會留給你的。

編輯:

要計算的班兩名學生曾一起數,你可以使用group by

select c1.student, c2.student, count(*) as NumClasses 
from ClassStudents c1 join 
    ClassStudents c2 
    on c1.class = c2.class and 
     c1.student < c2.student 
group by c1.student, c2.student; 

您可以使用having條款通過count(*)進行過濾。您可以將其加入其他表格以獲取特定的課程。

這裏是你如何加入該回到原來的表:

select s1.name as student1, s2.name as student2, count(*) as NumClasses 
from ClassStudents c1 join 
    ClassStudents c2 
    on c1.class = c2.class and 
     c1.studentid < c2.studentid join 
    Students s1 
    on c1.studentid = s1.studentid join 
    Students s2 
    on c2.studentid = s2.studentid 
group by c1.name, c2.name 
having count(*) > 1; 

你也可以做到這一點作爲一個子查詢,但是這是很容易做到。

+0

我喜歡這裏要去的地方。是否可以只顯示參加超過1門課程的人員? – endyourif

+0

我有團隊工作,但我不知道如何獲取類名,因爲我不能在選擇列表中使用它,因爲它不能成爲組的一部分。 – endyourif

+0

提示:使查詢成爲子查詢,然後將其他表連接到它。這是功課嗎? –

0

創建列表中爲每個學生很容易,比你Merge使用WHEN MATCHED THEN

例如兩個結果:讓學生A出席類SAC1SAC2針對學生B調用類

MERGE SAC1 AS target 
    USING SAC2 AS source 
    ON (target.class = source.class) 
WHEN MATCHED THEN 
    --insert into result table 

如果你想列出所有參加同班同學的學生,請點擊這裏

MERGE studentClasses AS target 
    USING studentClasses AS source 
    ON ((target.class = source.class) AND (target.studentId <> source.studentId)) 
WHEN MATCHED THEN 
    --insert into result table 
+0

你能否提供一個例子。我從未使用過合併功能,或者創建了每個學生的列表。 如果學生只匹配10個或1個或2個課程,這項工作是否可行? – endyourif

+0

我已更新答案 - 希望它有幫助 – Mzf

+0

2個列表是否需要完全匹配?我只想知道他們一起參加的班級,因爲他們可能需要其他班級,而且名單不會完全匹配。 – endyourif