Postgres“NOT IN”运算符用法

时间:2012-09-24 03:06:28

标签: postgresql postgresql-9.1

在我运行以下查询的数据库中,我得到1077作为输出。

select count(distinct a_t1) from t1;

然后,当我运行此查询时,我得到459。

select count(distinct a_t1) from t1 
where a_t1 in (select a_t1 from t1 join t2 using (a_t1_t2) where a_t2=0); 

以上是相同的,这个查询也给出了459:

select count(distinct a_t1) from t1 join t2 using (a_t1_t2) where a_t2=0

但是当我运行这个查询时,我得到0而不是618,这是我期待的:

select count(distinct a_t1) from t1 
where a_t1 not in (select a_t1 from t1 join t2 using (a_t1_t2) where a_t2=0);

我正在运行PostgreSQL 9.1.5,这可能不是必需的。请在上面的查询中指出我的错误。

更新1: 我创建了一个新表,并将上面子查询的结果输出到该表中。然后,我跑了几个问题:

select count(distinct a_t1) from t1
where a_t1 not in (select a_t1 from sub_query_table order by a_t1 limit 10);

和万岁!现在我得到10作为答案!我能够将限制增加到450.之后,我又开始变为0。

更新2:

sub_query_table中有459个值。最后,这个查询给了我所需的答案:

select count(distinct a_t1) from t1
where a_t1 not in (select a_t1 from sub_query_table order by a_t1 limit 459);

在这个位置,给出0作为答案:

select count(distinct a_t1) from t1
where a_t1 not in (select a_t1 from sub_query_table);

但是,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

'NOT IN'运算符仅适用于'NOT NULL'。值为null的列不匹配。

select count(distinct a_t1) from t1 
where a_t1 not in (select a_t1 from t1 join t2 using (a_t1_t2) where a_t2=0) OR a_t1 IS NULL;