【问题标题】:SELECT WHERE COUNT = 1选择计数 = 1
【发布时间】:2014-03-19 10:31:03
【问题描述】:

LESSON 具有字段LessonDate, MemberId(除其他外,但只有这两个是相关的)

用英语:给我一份只上过一门课的学生上那门课的日期列表。

我已经尝试了很多东西。这是我最近的尝试:

SELECT LessonDate 
FROM LESSON 
WHERE (SELECT COUNT(MemberId) GROUP BY (MemberId)) = 1

只是不断返回 SQL 错误。很明显,语法和逻辑都关了。

【问题讨论】:

  • 您的问题正在被标记,因为您没有证明您已经非常研究过这个问题。在实际发布问题之前,您可能需要查看 This article on how to ask questions 并执行一些基本搜索。
  • 抱歉,我只是想让我的问题保持简洁明了。我认为这有点不公平,在提出要求之前我确实做了很多研究并尝试了很多东西,但我意识到我不知道我需要什么才能让它发挥作用。在这种情况下,它是 HAVING 子句,这是我以前从未见过的。你不知道你不知道什么。

标签: sql sql-server subquery


【解决方案1】:

这个查询起初可能看起来有点违反直觉。您需要按MemberId 分组才能获得只上过一节课的学生:

select max(l.LessonDate) as LessonDate
from Lesson l
group by l.MemberId
having count(*) = 1;

因为学生只有一门课,max(l.LessonDate) 就是那个日期。因此,这可以满足您的要求:它会获取只参加过一门课程的成员的所有日期。

你的思路也很接近。这是我认为您正在寻找的查询:

SELECT LessonDate 
FROM LESSON 
WHERE MemberId in (SELECT l2.MemberId
                   FROM Lesson l2
                   GROUP BY l2.MemberId
                   HAVING COUNT(*) = 1
                  );

如果您想获取具有 2 或 3 行的成员的日期,这种方法更通用。

【讨论】:

  • 完美!非常感谢! “l2”真的有必要吗?那叫什么?
  • @pownassis 。 . . l2 不一定在此查询中。它被称为“表别名”,只是用来区分子查询中的表和外部查询中的表。
【解决方案2】:

您需要查看SELECT ... FROM ... GROUP BY ... HAVING 通过搜索GROUP BY 可以在线获取大量文档,例如This article

MemberId 的以下 SQL 分组我认为是错误的,因为您想计算成员 ID 的数量,

SELECT
    LessonDate
    , MemberId 
    , COUNT(*) AS Lesson_Count
FROM 
    Lesson 
GROUP BY
    LessonDate
    , MemberId 
HAVING
    COUNT(*) = 1 

上述查询将为您提供“日期”、“成员”的列表,以及该“成员”在该日期上的课程数量。我认为您不需要将聚合函数 (COUNT(*) AS Lesson_Count) 作为 select 语句的一部分,但它通常“很高兴”让您确信您的结果符合您的预期。

您的查询实际上失败了,因为子查询没有 FROM 语句,但以上是更好的做法:

SELECT LessonDate 
FROM LESSON 
WHERE (SELECT COUNT(MemberId) FROM Lesson GROUP BY (MemberId)) = 1

【讨论】:

    【解决方案3】:
    select count(LessonDate) as Lesson_date,MemberId from Lesson group by MemberId having Lesson_Date=1 
    

    select * from 
    (
    select *,rn=Row_number()over(partition by LessonDate order by MemberId) from Lesson
    )
    where rn=1
    

    【讨论】:

      【解决方案4】:

      以下应该有效:

      SELECT LessonDate
      FROM LESSION L
      WHERE (SELECT COUNT(1) FROM LESSION WHERE MemberId=L.MemberId)=1
      

      【讨论】:

      • Thanx Wibble,我在这里是个菜鸟 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 2013-01-01
      • 2015-12-07
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多