select * from tableA as AA join tableB as BB;
有表中有许多相同的列,所以我希望所有的列来对表的别名输出前缀。像:AA.id,...,BB.id,...
我该怎么做?
编辑:我知道我可以手动命名列,但是我希望所有这些都可以在表别名后自动命名。
感谢
select * from tableA as AA join tableB as BB;
有表中有许多相同的列,所以我希望所有的列来对表的别名输出前缀。像:AA.id,...,BB.id,...
我该怎么做?
编辑:我知道我可以手动命名列,但是我希望所有这些都可以在表别名后自动命名。
感谢
您可以使用:
忽略笛卡尔乘积,这将产生在MySQL,它不会缓解这样一个事实,即您将无法从任一表中的同名列中检索值。 SELECT *
也是不好的做法,冒着你不需要的数据检索的风险。
您必须为相同名称的列定义列别名,或者更改表格以更改列名称。
创建列名的别名也。当然,你必须提到你想要输出的每个列名,而不是*
,这里没有自动化版本。
select AA.colname as AA_colname, BB.colname as BB_colname
from tableA as AA join tableB as BB;
select *
是“懒惰”。您应该始终指定您想要的字段,并且如果两个表之间存在冲突,则必须明确指定您想要的哪些冲突字段以及哪个表。
是的,这是繁琐的,特别是如果你希望所有的领域,但这就是生活......
动态命名列的最简单方法是生成一个引用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限制。