2011-04-26 58 views
1

我跑MYSQL:使加入的结果与列名携带表的别名

select * from tableA as AA join tableB as BB; 

有表中有许多相同的列,所以我希望所有的列来对表的别名输出前缀。像:AA.id,...,BB.id,...

我该怎么做?

编辑:我知道我可以手动命名列,但是我希望所有这些都可以在表别名后自动命名。

感谢

回答

1

您可以使用:

​​

忽略笛卡尔乘积,这将产生在MySQL,它不会缓解这样一个事实,即您将无法从任一表中的同名列中检索值。 SELECT *也是不好的做法,冒着你不需要的数据检索的风险。

您必须为相同名称的列定义列别名,或者更改表格以更改列名称。

2

创建列名的别名也。当然,你必须提到你想要输出的每个列名,而不是*,这里没有自动化版本。

select AA.colname as AA_colname, BB.colname as BB_colname 
from tableA as AA join tableB as BB; 
3

select *是“懒惰”。您应该始终指定您想要的字段,并且如果两个表之间存在冲突,则必须明确指定您想要的哪些冲突字段以及哪个表。

是的,这是繁琐的,特别是如果你希望所有的领域,但这就是生活......

0

动态命名列的最简单方法是生成一个引用information_schema的预处理语句。这会给你你想要的结果。

SET @sql = NULL; 
SELECT CONCAT('SELECT ',GROUP_CONCAT(c.TABLE_NAME,'.',c.COLUMN_NAME, 
    ' ''',t.TABLE_COMMENT,'.',c.COLUMN_NAME,''''),' FROM tableA JOIN tableB;') 
INTO @sql 
FROM INFORMATION_SCHEMA.COLUMNS c JOIN INFORMATION_SCHEMA.TABLES t 
ON c.TABLE_NAME = t.TABLE_NAME 
WHERE c.TABLE_NAME IN ('tableA','tableB'); 
PREPARE sql_statement FROM @sql; 
EXECUTE sql_statement; 

没有AA,BB别名更简单。上述方法要求您在INFORMATION_SCHEMA.TABLES.TABLE_COMMENT中的每个表的表注释字段中设置它们。更新information_schema.tables设置table_comment ='AA'等...

GROUP_CONCAT()函数的默认限制为1024个字符,因此取决于表中的列数,您可能需要提高此限制为了生成准备好的语句。

SET SESSION group_concat_max_len = 1000000; 

如果需要,该命令将提高集团CONCAT限制。