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

如何在SQLite中批量查询所有非系统表的CATEGORY列去重值?

在SQLite中批量查询多表的CATEGORY列去重值

问题原因

SQLite不支持直接通过子查询动态指定表名,直接嵌套子查询会触发语法错误,必须通过动态SQL的方式实现需求。

解决方法

方法1:手动生成联合查询语句

先执行以下SQL,自动拼接出针对所有目标表的联合查询语句:

SELECT GROUP_CONCAT(
    -- 若表名含空格/关键字,改用 'SELECT DISTINCT CATEGORY FROM "' || name || '"'
    'SELECT DISTINCT CATEGORY FROM ' || name,
    ' UNION ALL ' -- 需要全局去重则替换为 ' UNION '
) AS combined_sql
FROM sqlite_schema 
WHERE type='table' 
    AND name NOT LIKE 'sqlite_%'
    -- 提前过滤无CATEGORY列的表,避免执行报错
    AND EXISTS (SELECT 1 FROM pragma_table_info(name) WHERE name = 'CATEGORY');

执行后会得到一个完整的SQL语句,复制该语句再次执行,即可获取所有表的CATEGORY去重值。

方法2:脚本自动化执行(以Python为例)

如果需要批量自动化处理,可通过编程语言连接数据库动态生成并执行查询:

import sqlite3

# 连接目标数据库
conn = sqlite3.connect('你的数据库文件名.db')
cursor = conn.cursor()

# 获取所有包含CATEGORY列的目标表
cursor.execute("""
    SELECT name
    FROM sqlite_schema 
    WHERE type='table' 
        AND name NOT LIKE 'sqlite_%'
        AND EXISTS (SELECT 1 FROM pragma_table_info(name) WHERE name = 'CATEGORY');
""")
tables = [row[0] for row in cursor.fetchall()]

# 构建联合查询语句
query_parts = [f"SELECT DISTINCT CATEGORY FROM `{table}`" for table in tables]
final_query = ' UNION ALL '.join(query_parts)

# 执行查询并输出结果
cursor.execute(final_query)
for category in cursor.fetchall():
    print(category[0])

# 关闭数据库连接
conn.close()

注意事项

  • UNION ALL会保留不同表中重复的CATEGORY值,若需要全局去重,替换为UNION即可。
  • 若表名包含空格、SQL关键字等特殊字符,需用反引号(`)或双引号(")包裹表名,避免语法错误。

内容的提问来源于stack exchange,提问作者ebbishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:55:21