You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL作业查询:筛选无在借图书且有96年前出生子女的会员地址

解决方案:筛选符合条件的图书馆会员地址

正确查询语句(两种实现方式)

方式一:使用NOT EXISTS子查询(推荐)

select member.member_no, member.firstname, member.middleinitial, member.lastname, adult.street, adult.city
from member
join adult on member.member_no = adult.member_no
join juvenile on juvenile.adult_member_no = member.member_no
where juvenile.birth_date < '1996-01-01'
  and not exists (
    select 1 
    from loan 
    where loan.member_no = member.member_no
  )

方式二:使用LEFT JOIN + IS NULL

select distinct member.member_no, member.firstname, member.middleinitial, member.lastname, adult.street, adult.city
from member
join adult on member.member_no = adult.member_no
join juvenile on juvenile.adult_member_no = member.member_no
left join loan on member.member_no = loan.member_no
where juvenile.birth_date < '1996-01-01'
  and loan.member_no is null

原理说明

  1. 原有尝试无效的原因
    你用INNER JOIN loan的方式只会返回有在借记录的会员,后续的member.member_no not like loan.member_no逻辑完全不成立——因为INNER JOIN已经确保了两边的member_no是匹配的,不可能出现不相等的情况。另外,like是字符串模糊匹配运算符,member_no通常是数字类型,用它做相等判断本身就是错误的用法。

  2. NOT EXISTS的逻辑
    子查询会检查当前会员在loan表中是否存在记录:如果子查询没有返回任何行,说明该会员当前无在借图书,NOT EXISTS条件成立,该会员会被保留。这种方式逻辑直观,数据库优化器通常能高效处理这类关联子查询。

  3. LEFT JOIN + IS NULL的逻辑
    LEFT JOIN会保留左表(即你已筛选出的、有符合条件子女的会员)的所有行,即使loan表中没有匹配的记录。当loan.member_no为NULL时,说明该会员没有在借记录。需要注意加DISTINCT,因为一个会员可能有多个符合条件的子女,JOIN juvenile会产生重复行,DISTINCT用于去重。

内容的提问来源于stack exchange,提问作者Olaf Szczap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:20:59