mariadb 当子查询结果为单个NULL行时使用NOT IN(...)

zbq4xfa0  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(118)

当子查询返回单个NULL结果行时,NOT IN条件得到意外的结果。
这里有两个表,brands和media。目标是得到一个结果,只包括那些没有给定media_type的媒体与之关联的品牌。

SELECT * 
FROM brands 
WHERE id NOT IN (
    SELECT DISTINCT brand AS 'id'
    FROM media
    WHERE media_type=7
)

当media_type=7的条目与brands关联时,子查询将返回至少包含一个有效id的列表,查询将按预期工作。
但是,如果media_type=7的条目与任何品牌都没有关联,则子查询将返回一个值为NULL的行。然后,total查询将返回一个空集,而不是预期的:返回所有品牌行的结果。
我在这里犯了什么错误?
使用10.4.26-MariaDB和表是InnoDB类型

lztngnrs

lztngnrs1#

请尝试以下相关的 exists 查询

select * 
from brands b
where not exists (
  select * from media m
    where m.media_type = 7 and m.brand = b.Id
);
kqlmhetl

kqlmhetl2#

如果没有更多的细节,很难知道错误,但是另一个解决方案可以是执行LEFT JOIN,然后排除连接的行...

SELECT
    b.*
  FROM
    brands b
    LEFT JOIN
    media m
    ON m.brand = b.id
    AND m.media_type = 7
  WHERE
    m.id IS NULL

即,选择连接失败的所有记录...因为这些记录具有匹配的ID和media_type 7

相关问题