我有两张关系为一对多的表
例如,以学生和表演表为例。这里学生和表演表有一对多的关系
学生:
性能:
现在我必须编写一个存储过程,它将输入作为多个学生ID,学生姓名和部分详细信息作为数据表,并告知在数据表中传递的所有记录是否具有相同的百分比,主题ID,性能表中的其他活动的值或不。
任何建议都有帮助
答案 0 :(得分: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 (…)
之类的条件下使用整个查询,只需将CTE转换为常规子选择,即如下:
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
<强>更新强>
以下是同一解决方案的简化版本:
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)