MySQL中如何从两个ID不相交的表查询指定ID的唯一存在行?
解决方案:统一字段结构后用UNION ALL单次查询
当然有办法解决这个问题!核心思路是让两个查询的结果字段结构完全一致,这样就能用UNION ALL合并结果,而因为两个表的ID是不相交的,最终只会返回符合条件的那一行,完全不用执行两次查询。
基础实现代码
你只需要给字段更少的table1补充缺失的字段(用NULL填充),确保两个SELECT语句返回的列数、字段类型匹配,然后用UNION ALL合并即可:
SELECT id, stuff, more_stuff, something, NULL AS even_more FROM table1 WHERE id = given_id UNION ALL SELECT id, stuff, more_stuff, something, even_more FROM table2 WHERE id = given_id;
为什么这么做可行?
table1没有even_more字段,我们用NULL AS even_more模拟这个字段,让两个结果集的结构完全对齐,满足UNION类语句的要求。- 由于两个表的ID是不相交的,两个
WHERE条件只会有一个命中,最终结果只会包含一行数据——就是你要找的那一行。 - 用
UNION ALL而不是UNION是因为前者不需要做去重检查,执行效率更高,完全适配你的场景。
可选:添加来源表标识
如果你想知道返回的数据来自哪个表,可以额外加一个标识字段:
SELECT 'table1' AS source_table, id, stuff, more_stuff, something, NULL AS even_more FROM table1 WHERE id = given_id UNION ALL SELECT 'table2' AS source_table, id, stuff, more_stuff, something, even_more FROM table2 WHERE id = given_id;
这样结果里会多一列source_table,直接告诉你数据来自table1还是table2。
内容的提问来源于stack exchange,提问作者SimonSchuler
相关产品推荐
相关产品推荐

