关联INFORMATION_SCHEMA表查询时DATA_TYPE返回错误的技术求助
解决GROUP BY导致DATA_TYPE返回不正确的问题
看起来你遇到的问题根源有两个:一是关联条件不完整,二是GROUP BY子句的逻辑不符合预期。让我一步步拆解并解决:
问题解析
- 关联条件缺了关键字段:你的SQL里只关联了
TABLE_SCHEMA和TABLE_NAME,但没关联COLUMN_NAME——这相当于让COLUMNS(A表)和STATISTICS(B表)做了笛卡尔积关联,同一索引列(B.COLUMN_NAME)会匹配到表中所有列的DATA_TYPE,数据本身就乱了。 - GROUP BY的用法有问题:你只按
B.COLUMN_NAME分组,但A.DATA_TYPE既不在GROUP BY列表里,也没加聚合函数(比如MAX()、MIN())。在宽松的SQL模式下(比如MySQL没开ONLY_FULL_GROUP_BY),数据库会随机返回分组里某一行的DATA_TYPE,自然得不到正确结果。
解决方案
先修正关联条件,加上A.COLUMN_NAME = B.COLUMN_NAME,确保每个索引列对应正确的字段类型。然后根据你的需求(获取去重的B.INDEX_NAME和B.COLUMN_NAME),可以选两种方式:
方式1:用DISTINCT(更直观)
如果只是想去掉INDEX_NAME和COLUMN_NAME的重复组合,直接用DISTINCT就行,不需要GROUP BY:
SELECT DISTINCT A.DATA_TYPE, B.INDEX_NAME, B.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS as A JOIN INFORMATION_SCHEMA.STATISTICS as B ON B.TABLE_SCHEMA = A.TABLE_SCHEMA AND B.TABLE_NAME = A.TABLE_NAME AND B.COLUMN_NAME = A.COLUMN_NAME WHERE B.TABLE_SCHEMA = "mySchema" AND B.TABLE_NAME = "myTable";
方式2:规范使用GROUP BY
如果一定要用GROUP BY,要把所有非聚合列加入GROUP BY列表(或者用聚合函数包裹DATA_TYPE,毕竟同一列的类型是唯一的,用MAX()/MIN()结果都一样):
SELECT A.DATA_TYPE, B.INDEX_NAME, B.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS as A JOIN INFORMATION_SCHEMA.STATISTICS as B ON B.TABLE_SCHEMA = A.TABLE_SCHEMA AND B.TABLE_NAME = A.TABLE_NAME AND B.COLUMN_NAME = A.COLUMN_NAME WHERE B.TABLE_SCHEMA = "mySchema" AND B.TABLE_NAME = "myTable" GROUP BY B.INDEX_NAME, B.COLUMN_NAME, A.DATA_TYPE;
或者简化成:
SELECT MAX(A.DATA_TYPE) AS DATA_TYPE, -- MIN()也可以,结果一致 B.INDEX_NAME, B.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS as A JOIN INFORMATION_SCHEMA.STATISTICS as B ON B.TABLE_SCHEMA = A.TABLE_SCHEMA AND B.TABLE_NAME = A.TABLE_NAME AND B.COLUMN_NAME = A.COLUMN_NAME WHERE B.TABLE_SCHEMA = "mySchema" AND B.TABLE_NAME = "myTable" GROUP BY B.INDEX_NAME, B.COLUMN_NAME;
小提醒
- 尽量用显式
JOIN语法代替逗号分隔的隐式关联,可读性更强,也不容易漏加关联条件。 - 建议开启
ONLY_FULL_GROUP_BY模式(MySQL默认已开启),能强制你写出符合SQL标准的GROUP BY语句,避免随机返回值的坑。
内容的提问来源于stack exchange,提问作者Lixo
相关产品推荐
相关产品推荐

