MYSQL:使用带有表别名的列名来连接结果

时间:2011-04-26 05:24:06

标签: mysql alias

我跑

select * from tableA as AA join tableB as BB;

表中有许多相同的列,所以我希望所有列都在表别名的输出上加前缀。喜欢:AA.id,...,BB.id,......

我该怎么做?

编辑:我知道我可以手动命名列,但我想在表别名后自动命名所有列。

由于

4 个答案:

答案 0 :(得分:3)

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

是的,这很乏味,特别是如果你想要所有的领域,那就是生活......

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用:

SELECT AA.*, BB.* 
  FROM tableA as AA 
  JOIN tableB as BB

忽略这将在MySQL上生成的笛卡尔积,它不会减轻这样一个事实,即你仍然难以从任何一个表中的同名列中检索值。 SELECT *也是不好的做法,冒着你不需要的数据检索的风险。

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

答案 3 :(得分: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 set table_comment ='AA'等...

GROUP_CONCAT()函数的默认限制为1024个字符,因此根据表中的列数,您可能需要提高此限制才能生成预准备语句。

SET SESSION group_concat_max_len = 1000000;

如果需要,此命令将提高组concat限制。