例如採取例如學生和性能表一個或多個記錄。這裏的學生和性能表有一對多的關係
學生:
性能:
現在我必須寫一個存儲過程,這需要輸入多重學生證,學生姓名和部分詳細信息爲datatable,並告知所有在datatable中傳遞的記錄是否具有相同的百分比值,主題ID和其他性能表中的活動值。
任何建議是有益的
例如採取例如學生和性能表一個或多個記錄。這裏的學生和性能表有一對多的關係
學生:
性能:
現在我必須寫一個存儲過程,這需要輸入多重學生證,學生姓名和部分詳細信息爲datatable,並告知所有在datatable中傳遞的記錄是否具有相同的百分比值,主題ID和其他性能表中的活動值。
任何建議是有益的
這查詢不返回行,如果查詢的所有學生都得到了相同的數據:
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)
非常感謝舍甫琴科,它的工作就像一個魅力 – 2011-06-02 14:38:57
@Sandeep:更新我的回答有一個簡單的版本。 – 2011-06-02 15:48:13
準備好對桌子糟糕設計的反饋。 「學生」表是完全沒有意義的,因爲您將所有數據都包含在「表現」表中。你真的應該正常化這個。 – JNK 2011-06-02 12:14:06
我提供的一個例子是關於我的業務場景 – 2011-06-02 12:26:31
@Sandeep - 你的真實表格是否有類似的重複? – JNK 2011-06-02 12:27:50