我需要获得所有学生的详细信息,无论是在6号或7号房间,还是在任何房间都没有。如果他们在其他房间,简单地说,我不希望有这样的记录
我的架构是:
students(roll_no, name,class,...)
rooms(room_no,...)
student_room(room_no,roll_no).
学生和房间通过student_room
表格相关联。
但是,我无法弄清楚如何为此编写查询。
答案 0 :(得分:2)
这将为您提供6或7以外房间内学生的详细信息:
WHERE IS NULL
现在您只需要反转此逻辑以返回另一个子集。这称为反连接。 SQL中没有直接的语法,但有几种方法可以使用现有语法实现它。如果我们将上述查询作为起点,则最接近的匹配反连接形式将是SELECT
s.*
FROM
student AS s
LEFT JOIN student_room AS sr ON s.roll_no = sr.roll_no
AND sr.room_no NOT IN (6, 7)
WHERE
sr.roll_no IS NULL
;
+ student
方法:
sr.roll_no IS NULL
这是它的工作原理:
连接结果本身将包含来自sr.roll_no IS NULL
表的所有学生,因为该表位于左外连接的左侧。
只有当相应的学生不在6或7室时,联接的右侧才会有数据。否则它将包含空值。
通过检查右侧是否有无匹配(sr.roll_no
; WHERE子句中排除匹配的行;它与fieldname
的工作方式相同} fieldname.raw
不能有空值。
答案 1 :(得分:1)
我明白了。
SELECT * FROM students
INNER JOIN
(SELECT roll_no,CASE WHEN room_no=6 or room_no=7 THEN 1
WHEN room_no IS NULL THEN 1
ELSE 0 END AS is_room
from student_room GROUP BY roll_no) AS room_info
ON students.roll_no=room_info.roll_no
AND room_info.is_room=1