You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关联INFORMATION_SCHEMA表查询时DATA_TYPE返回错误的技术求助

解决GROUP BY导致DATA_TYPE返回不正确的问题

看起来你遇到的问题根源有两个:一是关联条件不完整,二是GROUP BY子句的逻辑不符合预期。让我一步步拆解并解决:

问题解析

  1. 关联条件缺了关键字段:你的SQL里只关联了TABLE_SCHEMA和TABLE_NAME,但没关联COLUMN_NAME——这相当于让COLUMNS(A表)和STATISTICS(B表)做了笛卡尔积关联,同一索引列(B.COLUMN_NAME)会匹配到表中所有列的DATA_TYPE,数据本身就乱了。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:09