奇怪的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_sid和gaps_fend.product_whitelist.sid都是bigint
我可以通过使用 left join 和 where 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 IN
在 sub-query
returns 任何 NULL
值时失败,因此您的计数为零。因此解决方法是使用 LEFT JOIN
或 NOT 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
我无法理解查询,我找到了获取数据的解决方法,但我想知道发生了什么。
所以基本上我想获得所有不包含在另一个 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_sid和gaps_fend.product_whitelist.sid都是bigint
我可以通过使用 left join 和 where 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 IN
在 sub-query
returns 任何 NULL
值时失败,因此您的计数为零。因此解决方法是使用 LEFT JOIN
或 NOT 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