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

如何解决SQL查询中'main_id重复指定'的报错问题?

问题描述

我需要编写一条查询语句,针对特定表数据组合仅返回单行结果,当前使用的查询语句如下:

SELECT * 
FROM 
    (SELECT 
         *,
         ROW_NUMBER() OVER (PARTITION BY s.aaa_id ORDER BY s.Stats_ID DESC) AS Rank   
     FROM 
         dev.dbo.Stats s
     INNER JOIN 
         dev.dbo.Admin_X m ON s.main_id = m.main_id
     INNER JOIN 
         dev.dbo.Mod_Admin a ON s.aaa_id = a.aaa_id
     WHERE 
         m.early_reg_FLAG = 1 OR a.early_reg = 'Y'
    ) AA 
WHERE 
    Rank =1

但持续收到报错:

The column 'main_id' was specified multiple times for 'AA'.

我知道main_id来自不同的表,但还是出现这个报错,请问有什么修复方法?

修复方法

方法1:明确指定所需列,避免使用SELECT *

这是最规范且推荐的做法。SELECT *会同时取出Stats和Admin_X表中的main_id列,导致子查询结果集出现重复列名。你可以列出所有需要的字段,对于重复列,要么只保留其中一个(比如s.main_id),要么给列取别名区分:

SELECT s.aaa_id, s.Stats_ID, s.main_id, m.early_reg_FLAG, a.early_reg, AA.Rank
FROM 
    (SELECT 
         s.aaa_id, s.Stats_ID, s.main_id, m.early_reg_FLAG, a.early_reg,
         ROW_NUMBER() OVER (PARTITION BY s.aaa_id ORDER BY s.Stats_ID DESC) AS Rank   
     FROM 
         dev.dbo.Stats s
     INNER JOIN 
         dev.dbo.Admin_X m ON s.main_id = m.main_id
     INNER JOIN 
         dev.dbo.Mod_Admin a ON s.aaa_id = a.aaa_id
     WHERE 
         m.early_reg_FLAG = 1 OR a.early_reg = 'Y'
    ) AA 
WHERE 
    AA.Rank =1

方法2:给重复列名取别名(需保留多表重复列时使用)

如果必须同时保留两个表的main_id,可以在子查询中给它们分别设置别名,避免列名冲突:

SELECT * 
FROM 
    (SELECT 
         s.*, m.*, a.*,
         m.main_id AS m_main_id, -- 给Admin_X表的main_id取别名
         ROW_NUMBER() OVER (PARTITION BY s.aaa_id ORDER BY s.Stats_ID DESC) AS Rank   
     FROM 
         dev.dbo.Stats s
     INNER JOIN 
         dev.dbo.Admin_X m ON s.main_id = m.main_id
     INNER JOIN 
         dev.dbo.Mod_Admin a ON s.aaa_id = a.aaa_id
     WHERE 
         m.early_reg_FLAG = 1 OR a.early_reg = 'Y'
    ) AA 
WHERE 
    Rank =1

注意:这种方式会引入冗余列(因为s.main_id和m.main_id在连接条件下值相等),仅在有特殊需求时使用。

方法3:外部查询指定重复列来源(不推荐)

如果不想修改子查询的SELECT *,可以在外部查询中明确列出所有需要的列,并指定重复列的来源表:

SELECT AA.aaa_id, AA.Stats_ID, AA.main_id, AA.early_reg_FLAG, AA.early_reg, AA.Rank
FROM 
    (SELECT 
         *,
         ROW_NUMBER() OVER (PARTITION BY s.aaa_id ORDER BY s.Stats_ID DESC) AS Rank   
     FROM 
         dev.dbo.Stats s
     INNER JOIN 
         dev.dbo.Admin_X m ON s.main_id = m.main_id
     INNER JOIN 
         dev.dbo.Mod_Admin a ON s.aaa_id = a.aaa_id
     WHERE 
         m.early_reg_FLAG = 1 OR a.early_reg = 'Y'
    ) AA 
WHERE 
    AA.Rank =1

这种方式可读性差,且依赖数据库返回列的顺序,不如方法1稳妥。

内容的提问来源于stack exchange,提问作者SkyeBoniwell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:27:23