SQL作业求助:统计不包含指定列类型的表数量
解决“统计每种列类型对应的无该类型列的表数量”问题
核心思路
要得到每种数据类型对应的不包含该类型列的表数量,最直接的逻辑是:
- 先算出数据库中所有唯一表的总数
- 减去你已掌握的包含该类型列的表数量,差值就是目标结果
方法一:总数减包含数(推荐,效率更高)
用CTE(公共表表达式)拆分逻辑,更清晰易懂:
WITH total_tables AS ( -- 统计数据库内所有唯一表的数量 SELECT COUNT(DISTINCT table_schema || '.' || table_name) AS total FROM information_schema.columns ), type_included_tables AS ( -- 你的原查询,统计每种类型对应的包含该类型的表数 SELECT data_type, COUNT(DISTINCT table_schema || '.' || table_name) AS included_count FROM information_schema.columns GROUP BY data_type ) SELECT data_type, total_tables.total - type_included_tables.included_count AS excluded_count FROM type_included_tables, total_tables;
为什么你之前的WHERE Data_Type IS NULL没用?
information_schema.columns里的data_type字段不会为NULL——只要是存在的列,必然有对应的数据类型,所以这个条件过滤不到任何数据,结果自然和不加条件时一致。
方法二:用NOT EXISTS实现(符合你的猜想)
如果你想用NOT EXISTS,可以先生成所有数据类型和所有表的组合,再排除掉表包含对应类型列的情况,最后统计剩余的数量:
SELECT dt.data_type, COUNT(DISTINCT t.table_schema || '.' || t.table_name) AS excluded_count FROM ( -- 取出所有唯一的数据类型 SELECT DISTINCT data_type FROM information_schema.columns ) dt -- 笛卡尔积:让每个类型对应所有表 CROSS JOIN ( -- 取出所有唯一的表 SELECT DISTINCT table_schema, table_name FROM information_schema.columns ) t -- 排除掉那些表包含当前类型列的情况 WHERE NOT EXISTS ( SELECT 1 FROM information_schema.columns c WHERE c.table_schema = t.table_schema AND c.table_name = t.table_name AND c.data_type = dt.data_type ) GROUP BY dt.data_type;
内容的提问来源于stack exchange,提问作者ConfusedByRegex
相关产品推荐
相关产品推荐

