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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:43:13