为什么带有否定WHERE子句的这两个SELECT COUNT(*)不能正确求和?

时间:2019-01-22 11:14:56

标签: sql postgresql

我正在从带有where子句的表中选择行,但否定where子句会返回比应有的行更多的行。

给定一个具有1000行的表,一个select where返回600行,那个select where的取反版本不应该返回400行吗?

select count(*) from trips

行程表有420444行。

我选择了所有从周末开始的旅行

select count(*) from trips
where service_id in
(select service_id from calendar_dates
where date_part('dow', date) in (5, 6))

返回363272

运行相同的查询,但行程不是在周末开始

select count(*) from trips
where service_id in
(select service_id from calendar_dates
where date_part('dow', date) not in (5, 6))

返回377326

363272 + 377326 = 740598,远比420444

当所涉及的where子句中有子查询时,count函数的行为是否有所不同?

这是在具有GTFS数据https://developers.google.com/transit/gtfs/的数据库上完成的。我不知道自己错过了什么。

1 个答案:

答案 0 :(得分:4)

它不是否定的。

如果您的服务ID与dow = 3, 4, 5, 6相同,那么它将显示在2个计数中。

正确的否定是

select count(*) from trips
where service_id NOT in
(select service_id from calendar_dates
where date_part('dow', date) in (5, 6))

或与not exists

等效