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

如何查询DB2指定Schema中包含特定列的表?

DB2查询指定Schema下同时包含指定两列的表

原SQL存在的问题

你提供的SQL有两处明显错误:

  1. 最外层查询的SELECT NAME_1, NAME_2与子查询返回的TB_NAME列完全不匹配,逻辑矛盾;
  2. 子查询作为数据源时缺少FROM关键字,语法不完整,无法执行。

修正后的可行写法

方法1:基于INTERSECT修正原思路

通过INTERSECT取同时存在两列的表名,修正语法后可正常运行:

SELECT TB_NAME
FROM (
    SELECT C.TABNAME AS TB_NAME
    FROM SYSCAT.COLUMNS C
    INNER JOIN SYSCAT.TABLES T 
        ON T.TABSCHEMA = C.TABSCHEMA AND T.TABNAME = C.TABNAME
    WHERE T.TYPE = 'T'
      AND C.TABSCHEMA = 'MYSCHEMA'
      AND C.COLNAME = 'NAME_1'
    INTERSECT
    SELECT C.TABNAME AS TB_NAME
    FROM SYSCAT.COLUMNS C
    INNER JOIN SYSCAT.TABLES T 
        ON T.TABSCHEMA = C.TABSCHEMA AND T.TABNAME = C.TABNAME
    WHERE T.TYPE = 'T'
      AND C.TABSCHEMA = 'MYSCHEMA'
      AND C.COLNAME = 'NAME_2'
) AS TBLIST

方法2:分组统计(更高效的写法)

通过统计单表中匹配指定列的数量,筛选出同时包含两列的表,避免重复扫描系统表:

SELECT C.TABNAME AS TB_NAME
FROM SYSCAT.COLUMNS C
INNER JOIN SYSCAT.TABLES T 
    ON T.TABSCHEMA = C.TABSCHEMA AND T.TABNAME = C.TABNAME
WHERE T.TYPE = 'T'
  AND C.TABSCHEMA = 'MYSCHEMA'
  AND C.COLNAME IN ('NAME_1', 'NAME_2')
GROUP BY C.TABNAME
HAVING COUNT(DISTINCT C.COLNAME) = 2

补充说明

  • SYSCAT.COLUMNS存储DB2的列元数据,SYSCAT.TABLES存储表元数据;
  • T.TYPE = 'T'用于过滤出普通业务表,排除视图、别名等非表对象;
  • 方法2在系统表数据量较大时性能更优,仅需扫描一次系统表即可完成筛选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:27:35