使用T SQL检查一个或多个记录的数据是相同的

时间:2011-06-02 12:07:21

标签: sql sql-server

我有两张关系为一对多的表

例如,以学生和表演表为例。这里学生和表演表有一对多的关系

学生: enter image description here

性能: enter image description here

现在我必须编写一个存储过程,它将输入作为多个学生ID,学生姓名和部分详细信息作为数据表,并告知在数据表中传递的所有记录是否具有相同的百分比,主题ID,性能表中的其他活动的值或不。

任何建议都有帮助

1 个答案:

答案 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)