数据库查询返回重复行及重复列问题技术求助
解决数据库查询重复列与异常行问题
看起来你现在碰到了两个头疼的问题:查询结果里有重复的列名,还有部分数据为空的异常行。我来给你拆解一下解决思路:
一、先搞定重复列名的问题
从你贴的结果来看,id_stats和id_equipement都出现了两次,这一般是两种情况导致的:
- 你写SQL的时候不小心重复选了同一个字段,比如把
SELECT id_stats, nom_stats, id_equipement写成了SELECT id_stats, nom_stats, id_equipement, id_equipement,这种情况直接删掉重复的字段就行。 - 你关联了多张表,而这些表有同名的字段(比如stats表和equipement表都有id_stats),这时候给表加别名,明确指定字段来自哪个表就好:
这样返回的列名就不会重复了,还能清晰看到每个字段的来源。-- 给表加别名s、e、el,区分不同表的同名字段 SELECT s.id_stats, s.nom_stats, e.id_equipement, el.id_elements FROM stats s LEFT JOIN equipement e ON s.id_equipement = e.id LEFT JOIN elements el ON s.id_elements = el.id;
二、处理异常空行的问题
你的结果里第二行只有id_stats和nom_stats有值,其他都是空,这大概率是JOIN类型用错了,或者关联条件不对:
- 检查关联条件:如果你的JOIN的ON子句写得不对(比如关联了不相关的字段,甚至没写ON条件导致笛卡尔积),就会出现这种空行或者重复行。一定要确保关联的是表之间正确的外键关系,比如stats表的id_equipement对应equipement表的主键id。
- 用DISTINCT去重:如果确实存在完全重复的行(所有字段值都一模一样),可以在SELECT后面加
DISTINCT关键字,自动去掉重复行:SELECT DISTINCT s.id_stats, s.nom_stats, e.id_equipement, el.id_elements FROM stats s LEFT JOIN equipement e ON s.id_equipement = e.id LEFT JOIN elements el ON s.id_elements = el.id; - 过滤空值或换JOIN类型:如果这些空行是你不需要的,要么用WHERE过滤掉:
要么把LEFT JOIN改成INNER JOIN,这样只会返回那些能成功关联上的行,不会出现空值行:SELECT s.id_stats, s.nom_stats, e.id_equipement, el.id_elements FROM stats s LEFT JOIN equipement e ON s.id_equipement = e.id LEFT JOIN elements el ON s.id_elements = el.id -- 过滤掉关联后字段全为空的行 WHERE e.id_equipement IS NOT NULL OR el.id_elements IS NOT NULL;SELECT s.id_stats, s.nom_stats, e.id_equipement, el.id_elements FROM stats s INNER JOIN equipement e ON s.id_equipement = e.id INNER JOIN elements el ON s.id_elements = el.id;
小提示
如果按照上面的方法还是没解决,建议把你的完整SQL查询语句贴出来,这样能更精准地定位问题——比如是不是不小心关联了多余的表,或者GROUP BY用错了导致的异常行。
内容的提问来源于stack exchange,提问作者Zeyukan Ich'




