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



当子查询返回单个NULL结果行时,NOT IN条件会得到意外结果。

有两张桌子,品牌和媒体。目标是只得到一个结果,其中包括没有与之相关联的给定媒体类型的媒体的品牌。

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

如果存在与品牌相关联的media_type=7条目,那么子查询将返回至少一个有效id的列表,那么查询将按预期工作。

但是,如果没有media_type=7的条目与任何品牌相关联,则子查询返回具有NULL值的单行。然后,total查询返回一个空集,而不是预期的:一个包含所有brands行的结果。

我在这里犯了什么错误?

使用10.4.26-MariaDB和表格是InnoDB类型

尝试以下相关的存在查询

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

如果没有更多详细信息,很难知道错误,但另一个解决方案可能是执行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

最新更新