如何从SQL中选择没有特定值的记录

时间:2018-06-20 15:40:33

标签: sql

我列出了要完成多个英语水平的学生。有没有办法找到那些正在学习英语I而又没有升入新水平的学生

ID   STUDENTID  NAME     ENGLISHLEVEL   STARTDATE     ENDDATE
----------------------------------------------------------------
 1    001       Eric     English-1      2017-01-01    2018-01-01
 2    002       Brian    English-1      2017-01-01    2017-01-31
 3    002       Brian    English-2      2017-02-01    2017-03-01
 4    003       David    English-1      2017-05-01    2017-06-01
 5    003       David    English-2      2017-06-02    2017-07-03

我有一个与上述类似的列表,供成千上万的学生使用,我想知道如何查询该表,向我显示那些学习过英语1但从未开始使用英语2或英语3的学生

建议将不胜感激。

5 个答案:

答案 0 :(得分:1)

您可以使用outer join将表与其自身连接。让外部联接表检查English2 / 3,然后过滤出匹配的所有结果。

select
    eng1.*
from
    students_table eng1
    left outer join students_table eng2
        on (
            eng1.STUDENTID=eng2.STUDENTID 
            and eng2.ENGLISHLEVEL in ('English-2', 'English-3')
        )
where
    eng2.STUDENTID is null -- Filter out rows where an eng2 row was found

答案 1 :(得分:1)

您可以使用not exists

select t.*
from table t
where not exists (select 1 
                  from table t1 
                  where t1.STUDENTID = t.STUDENTID and 
                        t1.ENGLISHLEVEL in ('English-2', 'English-3')
                 );

答案 2 :(得分:1)

您的英语水平可以按字母顺序排序:

select studentid, name
from t
group by studentid, name
having max(englishlevel) = 'English-1'

答案 3 :(得分:0)

您可以在IN语句中使用WHERE来获得那些学习过英语1的学生

SELECT * FROM tblStudents
WHERE ENGLISHLEVEL IN ('English-1')

答案 4 :(得分:0)

“我正在学习英语的学生”在您的帖子表格中的数据含义是什么?

表格中的数据术语“和没有转移到下一层”是什么意思?

您是否有一个表,其中包含所有可能的ENGLISHLEVEL值?

如何填充STARTDATE和ENDDATE列?

如果仅在人员实际完成培训后填充ENDDATE,则可以在此处使用NULL值来查找尚未完成培训的人员。那可能就是去这里的方式。

如果您有一个表定义了ENGLISHLEVEL的所有可能值,则可以将不同的ENGLISHLEVEL值的计数与ENGLISHLEVEL表中的值计数进行比较,这将告诉您哪些学生已完成所有课程。您还可以通过这种方式对每次培训进行此比较。

相关问题