代码之家  ›  专栏  ›  技术社区  ›  stats_noob

SQL:理解NOT IN函数

sql
  •  0
  • stats_noob  · 技术社区  · 1 年前

    我正在使用Netezza SQL。

    我有下表:

       student_id years
    1         123  2010
    2         123  2011
    3         123  2012
    4         124  2010
    5         124  2011
    6         124  2012
    7         124  2013
    8         125  2010
    9         125  2011
    10        125  2012
    11        125  2013
    12        125  2014
    

    我的问题: 我只想选择只有年份的学生=(2010201120122013)。这意味着在上表中,将只选择student_id=124。

    以下是我使用NOT IN函数的查询(首先使用NOT IN选择不符合条件的学生…然后使用NOT IN排除不符合条件):

    SELECT student_id, years
    FROM my_data
    WHERE student_id NOT IN (
        SELECT student_id
        FROM my_data
        WHERE years NOT IN (2010, 2011, 2012, 2013)
    )
    

    但是,此查询错误地返回了学生123和学生124:

      student_id years
    1        123  2010
    2        123  2011
    3        123  2012
    4        124  2010
    5        124  2011
    6        124  2012
    7        124  2013
    

    有人能告诉我怎么修吗?最终答案应该只返回学生124。

    谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   Tim Biegeleisen    1 年前

    我在这里使用聚合方法

    WITH cte AS (
        SELECT student_id
        FROM my_data
        GROUP BY student_id
        HAVING COUNT(CASE WHEN years NOT IN (2010, 2011, 2012, 2013)
                          THEN 1 END) = 0 AND
               COUNT(DISTINCT years) = 4
    )
    
    SELECT student_id, years
    FROM my_data
    WHERE student_id IN (SELECT student_id FROM cte);