MySQL中UNION未返回全部行与IN查询结果不符的问题求助
MySQL UNION语句未返回全部行的排查问题
问题描述
我遇到了一个棘手的问题:MySQL的UNION语句未能返回全部行。
当执行以下IN查询时:
SELECT `full_address` FROM `x_servers` WHERE `service_type` IN ('boost','testboost')
返回了51行数据;但执行以下UNION查询时:
(SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost') UNION (SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost')
仅返回25行。
单独执行两个子查询时:
SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost'
返回31行,
SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost'
返回20行。
服务器信息
- Server: MySQL (Localhost via UNIX socket)
- Server type: MySQL
- Server version: 8.0.30-0ubuntu0.20.04.2 - (Ubuntu)
问题原因及解决方案
核心原因:UNION 默认去重
MySQL中UNION操作符的默认行为是合并结果集并自动剔除重复行,而IN查询会保留所有匹配的行(包括重复的full_address值)。
从数据统计来看:31+20=51,与IN查询的行数完全吻合;UNION返回25行,说明两个子查询的结果集中存在大量重复的full_address记录,这些重复项被UNION自动过滤了。
验证重复数据
可以通过以下查询确认去重后的总行数:
SELECT COUNT(DISTINCT `full_address`) FROM `x_servers` WHERE `service_type` IN ('boost','testboost');
该查询的结果应与UNION返回的行数一致(25行)。
解决方案
如果需要保留所有匹配行(包含重复的full_address),请使用UNION ALL替代UNION:
(SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'boost') UNION ALL (SELECT `full_address` FROM `x_servers` WHERE `service_type` = 'testboost')
UNION ALL不会对结果集去重,直接合并两个子查询的所有行,返回行数将与IN查询一致(51行)。
内容的提问来源于stack exchange,提问作者Dosyk
相关产品推荐
相关产品推荐

