我跑
select * from tableA as AA join tableB as BB;
表中有许多相同的列,所以我希望所有列都在表别名的输出上加前缀。喜欢:AA.id,...,BB.id,......
我该怎么做?
编辑:我知道我可以手动命名列,但我想在表别名后自动命名所有列。
由于
答案 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限制。