当我使用不同的列名作为条件时,sqlite not in 和 not contains 子句都不会返回任何数据

问题描述 投票:0回答:1

我正在使用 Excel 的 XLWINGS 插件,以便直接在 Excel 内部使用 SQL。 (XLWINGS 是一个 Python 插件,使用 SQLite 进行查询。)

我正在分析从 iNaturalist 下载的大约 20,000 条记录的表格。我的目标是展示哪些物种在一年中的某个月份“出现”。

我使用 SQL 创建表 B,其中显示了前几个月观察到的物种。然后,我进行第二次查询,以查找在我正在检查的月份期间观察到的物种,但表 B 中不存在哪些物种。

例如,为了显示 5 月出现的物种,第一个查询选择 1 月、3 月和 4 月的所有观测值。第二个查询应显示 5 月份观察到但在表 B 中未找到的所有物种。

当我使用以下代码创建表 B 时,所有这些都有效

select distinct species  from a where month <5 and species !=''

并通过以下代码获得最终结果:

select taxonomy,scientific_name, species, common_name,  date, image_url, id  from a where month = 5 and  species not in (select species from b) order by taxonomy, species, Month_day

我需要更改此设置以使用“scientific_name”而不是“species”以获得更有意义的结果。 “species”和“scientific_name”都是 Excel 中的文本数据类型,但更改后第二个查询不会产生任何输出。

在下面我只是将两个 Select 语句的“species”更改为“scientific_name”。第一个查询适用于表 B,但下面的第二个查询不会产生任何输出:

select taxonomy,scientific_name, species, common_name,  date, image_url, id  from a where month = 5 and  scientific_name not in (select scientific_name from b)  order by taxonomy, scientific_name, Month_day, species

我还尝试了以下方法,但也不起作用:

select taxonomy, scientific_name, species, common_name, date, image_url,id from a where month = 5 and not exists (select 1 from b where scientific_name = b.scientific_name) order by taxonomy, scientific_name, Month_day

任何想法都将受到欢迎。

excel sqlite xlwings
1个回答
0
投票

如果表 B 存在

scientific_name
为 NULL 的行,则由于 NULL 的三值逻辑,不在
(select scientific_name from b)
中的表达式将始终为 FALSE。 请参阅此处

另一个不存在的版本是正确的,但你需要比较

a.scientific_name = b.scientific_name

select taxonomy, scientific_name, species, common_name, date, image_url,id 
from a where month = 5 
and not exists (select 1 from b where a.scientific_name = b.scientific_name) 
order by taxonomy, scientific_name, Month_day
© www.soinside.com 2019 - 2024. All rights reserved.