1

我有 3 个加入的表,我想编写一个查询,从这些加入的表中返回一些字段。我需要检查一个条件,那就是特定于一个用户的行数。
为了更准确和清晰,我的表格如下所示:

tblTest
------------------------------
TestID  | StudentID | TestType
------------------------------

tblTestType
---------------------------
TestType | TestName 
---------------------------

tblStudents
-------------------------------
StudentID | StudentName | Sex
-------------------------------

我正在尝试获取第一次通过考试的学生列表(因此,'tblTest' 结果行数应该等于 1,以表明用户刚刚参加了考试并通过了考试,任何数字超过这意味着该学生已多次参加该考试),我的查询如下所示:

SELECT       tblStudents.StudentName, COUNT(tblTest.StudentID) AS [Number of Times Exame is Taken], tblTest.TestID
FROM            tblTest INNER JOIN
                         tblTestType ON tblTest.TestID = tblTestType.TestType INNER JOIN
                        tblStudents ON tblTest.StudentID =tblStudents.StudentID
GROUP BY tblTest.StudentID, tblTest.TestID
HAVING        (tblTest.TestID = 1)

哪个失败了。有人可以告诉我这样做的正确方法吗?

4

4 回答 4

1
SELECT       
tblStudents.StudentName, 
COUNT(tblTest.StudentID) AS [Number of Times Exame is Taken], 
MIN(tblTest.TestID) AS TestID
FROM            
tblTest 
INNER JOIN tblTestType ON tblTest.TestID = tblTestType.TestType 
INNER JOIN tblStudents ON tblTest.StudentID =tblStudents.StudentID
GROUP BY tblStudents.StudentName
HAVING COUNT(*) = 1
于 2012-09-14T11:07:03.373 回答
1

试试这个:

select * from tblTestType T
join
    (SELECT    tblStudents.StudentID, 
               COUNT(*) AS [Number of Times Exame is Taken], 
               tblTest.TestID
    FROM      tblTest
    GROUP BY  tblTest.StudentID, tblTest.TestID
    HAVING COUNT(*)=1 )a
ON a.TestID = T.TestType
INNER JOIN tblStudents
ON a.StudentID =T.StudentID
于 2012-09-14T11:09:18.907 回答
1
SELECT *
  FROM tblStudents
  WHERE StudentID IN (
    SELECT StudentID
      FROM tblTest
      GROUP BY StudentID, TestID
      HAVING COUNT(*) = 1
  )
于 2012-09-14T11:15:49.110 回答
1

也许这就是你所追求的?

WITH cteTest AS (
  SELECT COUNT(TestID) TakenCount, StudentID, TestType
  FROM tblTest
  GROUP BY StudentID, TestType
)
SELECT
    s.StudentName,
    tt.TestName
  FROM cteTest t
  INNER JOIN tblTestType tt ON t.TestType = tt.TestType
  INNER JOIN tblStudents s ON t.StudentID = s.StudentID
  WHERE t.TakenCount = 1;
于 2012-09-14T11:28:58.420 回答