使用XLWINGS+SQLite查询时NOT IN/NOT EXISTS无结果问题求助
解决
scientific_name字段查询无结果的问题 先排查数据本身的问题
- 空值导致
NOT IN失效
SQLite里如果NOT IN的子查询返回了NULL值,整个条件会直接排除所有结果——因为任何值和NULL比较的结果都是UNKNOWN,最终不会匹配任何行。修改建表B的语句,严格过滤空值:
select distinct scientific_name from a where month < 5 and scientific_name != '' and scientific_name is not null
- 字段格式不一致(大小写/空格)
iNaturalist的学名可能存在大小写差异、前后空格或隐藏字符,导致匹配失败。统一标准化字段后再查询:
建表B时:
select distinct trim(lower(scientific_name)) as scientific_name from a where month < 5 and trim(lower(scientific_name)) != ''
查询新物种时:
select taxonomy, scientific_name, species, common_name, date, image_url, id from a where month = 5 and trim(lower(scientific_name)) not in (select scientific_name from b) order by taxonomy, scientific_name, Month_day, species
修正NOT EXISTS的语法错误
你之前的NOT EXISTS语句逻辑写错了——关联条件里没有关联表a和表b,而是写了scientific_name = b.scientific_name(这永远为真,所以所有5月数据都被排除)。正确的关联写法:
select taxonomy, scientific_name, species, common_name, date, image_url, id from a where month = 5 and not exists ( select 1 from b where b.scientific_name = a.scientific_name ) order by taxonomy, scientific_name, Month_day
验证表B的有效性
- 先执行
select * from b,确认表B里的学名确实是1-4月的物种,没有混入5月数据。 - 如果
month字段是文本类型(不是数值),month <5会把"10""11"这类字符串也当成小于"5"(字符串按字符顺序比较),要转成数值再过滤:
select distinct scientific_name from a where cast(month as integer) < 5 and scientific_name != '' and scientific_name is not null
手动验证单条数据匹配
找一条5月的观测记录,复制它的scientific_name,执行select * from b where scientific_name = '复制的学名',看是否真的不存在。如果确实不存在但查询没结果,检查字段长度是否一致(用length(scientific_name)),排查是否有不可见的特殊字符。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

