如何查询DB2指定Schema中包含特定列的表?
DB2查询指定Schema下同时包含指定两列的表
原SQL存在的问题
你提供的SQL有两处明显错误:
- 最外层查询的
SELECT NAME_1, NAME_2与子查询返回的TB_NAME列完全不匹配,逻辑矛盾; - 子查询作为数据源时缺少
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
相关产品推荐
相关产品推荐

