【问题标题】:How to make Multi Table Sub Query less wordy Access如何使多表子查询不那么冗长访问
【发布时间】:2018-01-25 06:29:00
【问题描述】:

我正在尝试查询以查找不止一次采访的学生的所有详细信息

我已成功使用:

SELECT S.StudNo, S.StudLName, S.StudFName, S.StudMobile, S.City, S.DateEnrolled, S.ProgNo, S.AmountDue, S.Gender
FROM STUDENT AS S INNER JOIN STUDENT_INTERVIEW AS SI ON S.StudNo = SI.StudID
WHERE
(SELECT COUNT(SI.StudID)
FROM STUDENT_INTERVIEW)
GROUP BY S.StudNo, S.StudLName, S.StudFName, S.StudMobile, S.City, S.DateEnrolled, S.ProgNo, S.AmountDue, S.Gender
HAVING COUNT(SI.StudID) > 1;

但它似乎太长了.. 我正在尝试重写它以使其不那么罗嗦,尽管无法获得正确的结果。我一直在尝试使用更多的子查询来不必使用GROUP BY。当我这样做时,我会得到所有学生的结果,而不是我所追求的特定 2

SELECT *
FROM STUDENT
WHERE StudNo IN
(SELECT StudID
FROM STUDENT_INTERVIEW
WHERE 
(SELECT COUNT(StudID)
FROM STUDENT_INTERVIEW
HAVING COUNT(StudID) > 1;))

【问题讨论】:

  • 您是否将第一个查询错误地复制到您的帖子中?它在语法上是不正确的。 WHERE 子句不会评估为任何 TRUE/FALSE。

标签: sql ms-access subquery multi-table


【解决方案1】:

您的第一个查询是一个好的开始。这是一个改进:

SELECT S.*
FROM STUDENT AS S
WHERE S.StudNo IN (SELECT SI.StudId
                   FROM STUDENT_INTERVIEW as SI
                   GROUP BY SI.StudId
                   HAVING COUNT(*) > 1
                  );

外部查询既不需要JOIN,也不需要GROUP BY。基本上可以在子查询中完成所有工作。

【讨论】:

  • 非常感谢,我正在处理我从课堂上得到的笔记,我认为这些笔记不能很好地解释任何事情。如果您愿意解释,我很好奇 COUNT(*) 在这种情况下是如何工作的?我担心使用它假设它会计算所有内容并且不会缩小 StudID 的范围。因为它是 SELECT 中唯一的东西,所以 access 知道只计算 StudID 吗?
  • COUNT(*) 计算匹配行数。应该相当于计算主键。
  • 感谢您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2014-01-31
  • 2018-02-13
  • 2017-02-23
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多