You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:30:00