奇怪的postgresql查询

weird postgresql query

我无法理解查询,我找到了获取数据的解决方法,但我想知道发生了什么。

所以基本上我想获得所有不包含在另一个 table 中的 ID。如果我分别计算它们,我会得到这个:

select count(distinct product_sid) 
from gaps_inp.pim_product_channel pc 
where pc.channel_code = 'Amazon' 

count

200658

然后计算另一个 table:

select count(w.sid)
from gaps_fend.product_whitelist w 
where w.channel_code  = 'Amazon'

count

39697

但现在如果我尝试计算差异:

select count(*) 
from gaps_inp.pim_product_channel pc 
where pc.channel_code = 'Amazon' 
and pc.product_sid not in (
  select w.sid
  from gaps_fend.product_whitelist w 
  where w.channel_code  = 'Amazon'
);

count

0

两个字段gaps_inp.pim_product_channel.product_sidgaps_fend.product_whitelist.sid都是bigint

我可以通过使用 left joinwhere sid is null 来做到这一点,但我仍然想知道我在 where not in 查询中做错了什么。

这是解决方法:

select count(distinct pc.product_sid)
from gaps_inp.pim_product_channel pc 
left join gaps_fend.product_whitelist w on w.channel_code = 'Amazon' and pc.product_sid = w.sid
where pc.channel_code = 'Amazon'
and w.sid is null;

count

160968

我确定下面的查询

中存在一些 NULL
select w.sid
from gaps_fend.product_whitelist w 
where w.channel_code  = 'Amazon'

NOT INsub-query returns 任何 NULL 值时失败,因此您的计数为零。因此解决方法是使用 LEFT JOINNOT EXISTS 或在 sub-query

中添加 IS NOT NULL 条件

NOT EXISTS 可以处理 NULL 值的方法

SELECT Count(*)
FROM   gaps_inp.pim_product_channel pc
WHERE  pc.channel_code = 'Amazon'
       AND NOT EXISTS (SELECT 1
                       FROM   gaps_fend.product_whitelist w
                       WHERE  w.channel_code = 'Amazon'
                              AND w.sid = pc.product_sid); 

not in returns 如果子查询返回 NULL 值,则没有行。
添加 and w.sid is not null