【问题标题】:MySQL bug: NOT IN + subquery using GROUP BY HAVING returns nothingMySQL 错误:NOT IN + 使用 GROUP BY HAVING 的子查询不返回任何内容
【发布时间】:2018-02-27 03:36:31
【问题描述】:

我正在查询这张表:

SKU
aaaa
bbbb
bbbb
NULL

这是查询:

select *
from TEST as N                                      
where  N.SKU NOT IN (select SKU
                     from TEST
                     group by SKU
                     having count(*)>1);

我希望查询返回“aaaa”,但是,它什么也没返回。

我期望的原因是因为下面的子查询只返回'bbbb':

select SKU
from TEST
group by SKU
having count(*)>1   

因此,'aaaa' 不在子查询结果中。

要显示错误,请将这些语句复制并粘贴到您的 MySQL IDE 中以创建架构:

drop table if exists TEST;
create table TEST(
SKU varchar(255)
);
insert into TEST values('aaaa'),('bbbb'),('bbbb'),(NULL);

【问题讨论】:

  • 转载于 SQL Fiddle:sqlfiddle.com/#!9/769ffa/8
  • 好的,显然它与表中的 NULL 有关。删除 NULL 会返回“aaaa”行:sqlfiddle.com/#!9/93efbf/1
  • @John Woo 子查询不返回 NULL,因此在这种情况下 NOT IN 无法与 NULL 进行比较。
  • @Shawn 没问题,我真的不知道。用字符串常量列表替换子查询NOT IN ('bbbb')确实工作,所以它可能是优化器在内部做的事情。

标签: mysql


【解决方案1】:

如果子查询只返回一行,这可以正常工作:

SELECT * 
FROM TEST as N 
WHERE N.SKU NOT IN (
  CAST((select SKU from TEST group by SKU having count(*)>1) AS CHAR)
)

但是,如果它返回多于 1 行,则会触发错误。另一种解决方案(如果子查询返回多于 1 行):

SELECT * 
FROM TEST as N 
WHERE N.SKU IN (
  (select SKU from TEST group by SKU having count(*) <= 1)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多