如何解决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
相关产品推荐
相关产品推荐

