SQL语句与“;在;但当试图得到与“相反”的结果时;不在「;它输出一切
我试图输出所有在“NSA编程”中没有分数的学生。 对于在“NSA编程”课程中取得成绩的学生来说,使用“IN”而不是“NOT IN”的相同查询非常有效 但当我尝试用“不在”查询来反其道而行之时,输出的是所有的学生,现在只是那些在这堂课中没有分数的学生SQL语句与“;在;但当试图得到与“相反”的结果时;不在「;它输出一切,sql,oracle,sql-in,Sql,Oracle,Sql In,我试图输出所有在“NSA编程”中没有分数的学生。 对于在“NSA编程”课程中取得成绩的学生来说,使用“IN”而不是“NOT IN”的相同查询非常有效 但当我尝试用“不在”查询来反其道而行之时,输出的是所有的学生,现在只是那些在这堂课中没有分数的学生 SELECT oc_students.name, oc_students.last_name FROM oc_students INNER JOIN oc_grades ON oc_students.id_students=oc_grades.id
SELECT oc_students.name, oc_students.last_name
FROM oc_students
INNER JOIN oc_grades ON oc_students.id_students=oc_grades.id_students
WHERE oc_grades.id_lecture
NOT IN (SELECT oc_lecturesid_lecture FROM oc_lectures WHERE lecture_name='NSA programming');
不确定我对“不在”和“在”的理解是否错误,但从我所能看出,这应该是预期的效果,因为我只是颠倒了“在”陈述
如果有人能告诉我为什么这不起作用,也许能告诉我正确的方法,那就太棒了。当你只想选择某些学生时,不要加入。将您的条件放在
WHERE
子句中它们所属的位置
NSA编程成绩优异的学生:
SELECT name, last_name
FROM oc_students
WHERE id_students IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
SELECT name, last_name
FROM oc_students
WHERE id_students NOT IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
NSA编程没有成绩的学生:
SELECT name, last_name
FROM oc_students
WHERE id_students IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
SELECT name, last_name
FROM oc_students
WHERE id_students NOT IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
如果您只想选择某些学生,请不要加入。将您的条件放在
WHERE
子句中它们所属的位置
NSA编程成绩优异的学生:
SELECT name, last_name
FROM oc_students
WHERE id_students IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
SELECT name, last_name
FROM oc_students
WHERE id_students NOT IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
NSA编程没有成绩的学生:
SELECT name, last_name
FROM oc_students
WHERE id_students IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
SELECT name, last_name
FROM oc_students
WHERE id_students NOT IN
(
SELECT id_students
FROM oc_grades
WHERE id_lecture =
(SELECT id_lecture FROM oc_lectures WHERE lecture_name = 'NSA programming')
);
请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加实际使用的数据库的标记,注意子查询中的空值!(我通常建议
不存在
而不是不在
中)您确定在/不在
中反转实际上是反转您的查询吗?您的所有学生是否都至少参加过一次非NSA编程的讲座?抱歉,标记错误,请更正。我的数据库中没有空值@Damien_不信者是的,这是正确的。学生在其他课程中也有分数。根据我的理解,“不在”的工作方式是,如果学生在“NSA编程”中没有那个特定的分数,即使他在其他地方有分数,它也会输出他?你应该使用左连接而不是空。请不要使用不适用于你的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加实际使用的数据库的标记,注意子查询中的空值!(我通常建议不存在
而不是不在
中)您确定在
/不在
中反转实际上是反转您的查询吗?您的所有学生是否都至少参加过一次非NSA编程的讲座?抱歉,标记错误,请更正。我的数据库中没有空值@Damien_不信者是的,这是正确的。学生在其他课程中也有分数。根据我的理解,“不在”的工作方式是,如果学生在“NSA编程”中没有那个特定的分数,即使他在其他地方有分数,它也会输出他?你应该使用带NOTNULL的left join