Oracle 子查询批量统计表列数结果异常问题咨询
错误原因
你的SQL写法存在字段作用域优先级冲突的问题:
子查询中where table_name=TABLE_NAME没有指定表归属别名,Oracle解析SQL时会优先匹配当前子查询范围内的字段,也就是两个TABLE_NAME都会被识别为user_tab_columns的同名字段,最终条件等价于恒真,所以返回的是当前用户下所有表的列数总和,不是单表对应的列数。
修正后的SQL
给两张表分别加别名明确字段归属即可:
select t.TABLE_NAME, t.NUM_ROWS, (select count(*) from user_tab_columns c where c.table_name = t.TABLE_NAME) as COLUMN_COUNT from user_tables t
补充说明
user_tables中的NUM_ROWS是Oracle统计信息快照值,仅为估算值,不会实时同步表的实际行数,需要精准行数时需单独对目标表执行count(*)查询。- Oracle系统表的字段默认都是大写,如果你的表名建表时用了小写加双引号的特殊写法,需要额外调整匹配逻辑。
内容的提问来源于stack exchange,提问作者user9715288
相关产品推荐
相关产品推荐

