奇怪的postgresql查询

时间:2016-12-06 14:18:12

标签: sql postgresql postgresql-9.2

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

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

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

计数

     

200658

然后计算另一张桌子上的项目:

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

计数

     

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'
);
  

计数

     

0

两个字段 gaps_inp.pim_product_channel.product_sid gaps_fend.product_whitelist.sid bigint

我能够通过使用左连接,其中sid为空来实现,但我仍然想知道我在不在查询中。

这是解决方法:

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;
  

计数

     

160968

2 个答案:

答案 0 :(得分:2)

请确保以下查询

中存在一些NULL
select w.sid
from gaps_fend.product_whitelist w 
where w.channel_code  = 'Amazon'
NOT IN返回任何sub-query值时,

NULL失败,因此您的计数为零。因此,解决方法是使用LEFT JOINNOT EXISTS或在IS NOT NULL中添加sub-query条件

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); 

答案 1 :(得分:0)

如果子查询返回NULL值,则

not in不返回任何行 添加and w.sid is not null