@@ -287,9 +287,33 @@ public void visit(SubSelect subSelect, String alias) {
287287 QueryAnalyzerImpl sub = new QueryAnalyzerImpl (database , body , this );
288288 Map <String , Column > columnMap = new LinkedHashMap <>();
289289 for (Column column : sub .select .getColumnList ()) {
290+ // 判断子查询的列是否有显式的 SQL 别名(如 select name as n)
291+ // vs 隐式的 ORM 别名(如 select * 展开时,别名来自元数据)
292+ boolean hasExplicitSqlAlias = column .metadata != null
293+ && !Objects .equals (column .alias , column .metadata .getAlias ());
294+
295+ String exposedName ;
296+ RDBColumnMetadata colMetadata = column .metadata ;
297+
298+ if (hasExplicitSqlAlias ) {
299+ // 显式 SQL 别名:子查询暴露的列名是 SQL 别名(如 "n")
300+ // 克隆 metadata,设置 name 为别名,清除 realName
301+ // 使得 getRealName() 返回别名,realNameDetected() 返回 false(需要大小写规范化)
302+ exposedName = column .alias ;
303+ colMetadata = column .metadata .clone ();
304+ colMetadata .setName (column .alias );
305+ colMetadata .setAlias (column .alias );
306+ colMetadata .setRealName (null );
307+ } else if (column .metadata == null ) {
308+ // 表达式列或无元数据:使用别名作为暴露名
309+ exposedName = column .alias ;
310+ } else {
311+ // 隐式 ORM 别名(如 select *):子查询暴露的列名是原始列名
312+ exposedName = column .name ;
313+ }
290314
291315 columnMap .put (column .getAlias (),
292- new Column (column . name , column .getAlias (), column .owner , column . metadata ));
316+ new Column (exposedName , column .getAlias (), column .owner , colMetadata ));
293317 }
294318
295319 select = new QueryAnalyzer .Select (
@@ -391,7 +415,7 @@ private void putSelectColumns(QueryAnalyzer.Table table, List<QueryAnalyzer.Colu
391415 for (QueryAnalyzer .Column column : selectTable .columns .values ()) {
392416 String alias = table == select .table ? column .getAlias () : table .alias + "." + column .getAlias ();
393417 container .add (new QueryAnalyzer .Column (
394- column .name ,
418+ column .getName () ,
395419 alias ,
396420 table .alias ,
397421 column .metadata
@@ -669,6 +693,7 @@ public SqlFragments createTermFragments(QueryAnalyzerImpl impl, Term term) {
669693 }
670694
671695 String colName = col .metadata != null ? col .metadata .getRealName () : col .name ;
696+
672697 String fullName = col .metadata != null
673698 ? col .getMetadata ().getFullName (table .alias )
674699 : table .alias + "." + dialect .quote (colName , false );
@@ -713,8 +738,6 @@ private void initColumns(StringBuilder columns) {
713738 columns .append (select .columnList .get (0 ).owner ).append ('.' ).append ('*' );
714739 return ;
715740 }
716- // 判断主表是否是 SelectTable(子查询)
717- boolean isSelectTable = select .table instanceof QueryAnalyzer .SelectTable ;
718741
719742 for (Column column : select .columnList ) {
720743 if ("*" .equals (column .name )) {
@@ -730,16 +753,9 @@ private void initColumns(StringBuilder columns) {
730753 continue ;
731754 }
732755
733- // 对于 SelectTable(子查询),应该使用列的别名来引用列,而不是原始列名
734- // 因为子查询的列是通过别名暴露给外层查询的
735- String columnName = isSelectTable && column .owner != null
736- && column .owner .equals (select .table .alias )
737- ? column .alias // 使用别名
738- : column .name ; // 使用原始列名
739-
740756 columns .append (column .owner )
741757 .append ('.' )
742- .append (dialect .quote (columnName , column .metadata != null && !column .metadata .realNameDetected ()))
758+ .append (dialect .quote (column . name , column .metadata != null && !column .metadata .realNameDetected ()))
743759 .append (" as " )
744760 .append (dialect .quote (column .alias , false ));
745761 }
0 commit comments