2011-06-02 38 views
-3
我有2個表有一個的關係

許多檢查的數據是相同的使用T- SQL

例如採取例如學生和性能表一個或多個記錄。這裏的學生和性能表有一對多的關係

學生: enter image description here

性能: enter image description here

現在我必須寫一個存儲過程,這需要輸入多重學生證,學生姓名和部分詳細信息爲datatable,並告知所有在datatable中傳遞的記錄是否具有相同的百分比值,主題ID和其他性能表中的活動值。

任何建議是有益的

+2

準備好對桌子糟糕設計的反饋。 「學生」表是完全沒有意義的,因爲您將所有數據都包含在「表現」表中。你真的應該正常化這個。 – JNK 2011-06-02 12:14:06

+0

我提供的一個例子是關於我的業務場景 – 2011-06-02 12:26:31

+0

@Sandeep - 你的真實表格是否有類似的重複? – JNK 2011-06-02 12:27:50

回答

2

這查詢不返回行,如果查詢的所有學生都得到了相同的數據:

WITH StudentCount AS (
    SELECT COUNT(*) AS Cnt 
    FROM Students 
), 
RowDataCounts AS (
    SELECT 
    p.Percentage, 
    p.SubjectId, 
    p.OtherActivities, 
    Cnt = COUNT(*) 
    FROM Performance p 
    INNER JOIN Student s 
     ON p.StudentID = s.StudentID 
     AND p.Name = s.Name 
     AND p.Section = s.Section 
    GROUP BY 
    p.Percentage, 
    p.SubjectId, 
    p.OtherActivities 
) 
SELECT r.* 
FROM RowDataCounts r 
    LEFT JOIN StudentCounts s ON r.Cnt = s.Cnt 
WHERE s.Cnt IS NULL 

如果不是所有的數據都是在所有的學生一樣,查詢將返回顯示實際不同數據的行,以及有多少學生擁有這些信息。

如果您需要使用整個查詢像IF EXISTS (…)的條件,只是變換的熱膨脹係數,以傳統的子查詢,即是這樣的:

SELECT r.* 
FROM (… /* the RowDataCounts subquery here */) r 
    INNER JOIN (… /* the StudentCount subquery here */) s ON r.Cnt = s.Cnt 
WHERE s.Cnt IS NULL 

UPDATE

這裏有一個簡單的版本相同的解決方案:

SELECT 
    p.Percentage, 
    p.SubjectId, 
    p.OtherActivities, 
    Cnt = COUNT(*) 
FROM Performance p 
    INNER JOIN Student s 
    ON p.StudentID = s.StudentID 
    AND p.Name = s.Name 
    AND p.Section = s.Section 
GROUP BY 
    p.Percentage, 
    p.SubjectId, 
    p.OtherActivities 
HAVING COUNT(*) <> (SELECT COUNT(*) FROM Students) 
+0

非常感謝舍甫琴科,它的工作就像一個魅力 – 2011-06-02 14:38:57

+0

@Sandeep:更新我的回答有一個簡單的版本。 – 2011-06-02 15:48:13

相關問題