在MySQL表中查询指定ID列表里不存在的ID
嘿,我来帮你搞定这个问题!要从指定的ID列表[1,2,3,4,5,6,7,8,9]里找出tbl表中不存在的ID,有几个简单好用的方法:
方法一:用UNION ALL构造ID集合并左连接
这是兼容性最好的写法,几乎所有MySQL版本都支持。先把你要检查的所有ID通过UNION ALL拼成一个临时数据集,再和tbl表做左连接,筛选出没有匹配上的记录即可:
SELECT target_ids.id AS missing_id FROM ( SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) AS target_ids LEFT JOIN tbl ON target_ids.id = tbl.id WHERE tbl.id IS NULL;
解释:左连接会保留target_ids里的所有记录,当某个ID在tbl中不存在时,对应的tbl.id会是NULL,通过WHERE tbl.id IS NULL就能精准筛选出这些缺失的ID。
方法二:MySQL 8.0+ 可用的VALUES子句简化写法
如果你的MySQL版本是8.0及以上,可以用VALUES子句更简洁地构造ID集合:
SELECT id AS missing_id FROM (VALUES ROW(1), ROW(2), ROW(3), ROW(4), ROW(5), ROW(6), ROW(7), ROW(8), ROW(9)) AS target_ids(id) LEFT JOIN tbl USING(id) WHERE tbl.id IS NULL;
这个写法比UNION ALL更紧凑,代码可读性更高。
方法三:NOT IN 写法(适合ID非空场景)
因为你的tbl.id是NOT NULL的,也可以用NOT IN来实现,但要注意如果tbl.id允许为空的话,这个方法会返回空结果,所以只适合非空ID的场景:
SELECT id AS missing_id FROM ( SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) AS target_ids WHERE id NOT IN (SELECT id FROM tbl);
根据你提供的tbl数据,执行以上任意一种方法,都会得到结果:2,3,5,6,7,9,这些就是列表中不存在于表内的ID。
内容的提问来源于stack exchange,提问作者Alyas
相关产品推荐
相关产品推荐

