SQL JOIN查询使用SELECT *返回错误表id值的原因及解决方案问询
问题原因
你遇到的问题核心原因确实是所有表都存在名为id的同名列,和SELECT *的返回规则有关:
- 当使用
SELECT *做多表关联查询时,数据库会按查询顺序返回两个表的所有列,先返回PlayerDTO的所有列,再返回ClubDTO的所有列 - 当两个表存在重名列(比如你这里的
id)时,结果集中会存在两个名为id的列,大多数数据接收客户端、ORM框架在解析结果时,会直接用后出现的列值覆盖先出现的同名列值 - 你关联条件是
pl.currentClub = cl.id,所以ClubDTO的id值恰好等于pl.currentClub的值,最终呈现出来就是pl.id被替换成了currentClub的值
解决方案
不需要手动列出PlayerDTO的100多个列,可按你的使用场景选择对应方案:
- 如果你只需要
PlayerDTO的所有数据,不需要返回ClubDTO的字段:直接指定返回单表的所有列即可SELECT pl.* FROM PlayerDTO AS pl INNER JOIN ClubDTO AS cl ON pl.currentClub = cl.id WHERE cl.nation = 7 - 如果你同时需要返回
ClubDTO的部分字段:只需要单独列出Club表需要的字段,并给重名列加别名,Player表的字段还是用pl.*批量查询-- 示例:需要Club表的id、名称、地址字段,给同名列id加别名club_id SELECT pl.*, cl.id AS club_id, cl.name AS club_name, cl.address AS club_address FROM PlayerDTO AS pl INNER JOIN ClubDTO AS cl ON pl.currentClub = cl.id WHERE cl.nation = 7 - 如果你使用ORM框架做结果映射:可以开启框架的重名列自动映射配置,比如MyBatis可以设置对应参数搭配表前缀映射规则,JPA可以指定
@Column别名避免重名覆盖。
内容的提问来源于stack exchange,提问作者Eatton
相关产品推荐
相关产品推荐

