先确定必须保留哪一边
题目要求“列出所有学生及其已确认预约”时,所有学生是结果范围,预约只是可能缺失的附加信息。LEFT JOIN 保留左侧记录,但后面的 WHERE 仍能删除这些行。看到 LEFT JOIN 就认定所有左表记录最终一定存在,是常见误读。
原创例题:没有预约与预约未确认
students 有甲、乙、丙三人。bookings 中甲有 confirmed 记录,乙有 cancelled 记录,丙没有记录。若写 LEFT JOIN bookings b ON s.id=b.student_id WHERE b.status='confirmed',只剩甲:乙不满足状态条件,丙补出的 NULL 也不会让条件为真。
若目标是保留三人,应把预约状态限制放在 ON 内:LEFT JOIN bookings b ON s.id=b.student_id AND b.status='confirmed'。这时甲显示确认预约;乙、丙的右侧列均为 NULL。此结果表示没有匹配到确认预约,不等于两人从未有过任何预约。
不要用一个补丁掩盖不同含义
WHERE b.status='confirmed' OR b.student_id IS NULL 仍可能排除只有取消预约的乙,因为乙已经匹配到了非空右表行。先造出这种边界数据,能识别看似合理却未完成题意的修补。若一人有多条确认预约,结果可以有多行,应另行定义需要的粒度。
画表比反复试语法更有效
把三个人逐行写出“右表候选—ON 匹配—NULL 补行—WHERE 保留”四步。练习后加入第二条甲的预约,解释行数为何增加。学会追踪行的来源后,再处理计数和去重,避免用 DISTINCT 隐藏连接关系错误。
参考资料
下一步
需要中文大学课程辅导,可向阿尔比恩启航学院说明课程名称、卡住的步骤、已有尝试和学习目标。预约前确认学科适配、导师时间、费用及院校允许的帮助范围。例题用于独立练习,正式计分成果由学生本人完成。
