pg查询表所拥有的子表
来源:互联网 发布:提问软件 编辑:程序博客网 时间:2024/06/05 23:08
业务需求:
1.有两个schema 分别为a,b
2.schema a下有一张表,叫做a;schema b下有一张表,叫做b,b继承于a,即b为a的子表;其中表b.b可能存在,也可能不存在
在schema a进行删除前,需要判断它的表a是否存在与它不在同一个schema内的子表;如果子表存在,则父表不进行删除
可以清晰的看到,业务的难点,就是要得到schema a下的表a,它所拥有的子表schema名称和表名。
要完成以上业务需求,需要查询pg系统表。
由于子表使用inherits语法实现的,所以我们首先了解下pg_inherits表:
可以看到,pg_inherits表存了父表的oid和子表的oid
oid该如何得到呢?我们需要了解pg_class表
pg_class表里有relname表示表名,那么表所在的schema又如何确定呢?
可以清晰看到,就是用pg_namespace表的oid与pg_class表的relnamespace进行关联,并且用pg_namespace表的namespace过滤指定schema名称即可。
综上所述,通过以上三张表,我们可以完成期待完成的业务。
1.使用pg_namespace,pg_inherits,pg_class三张表关联,我们可以得到schema a的表a的子表名称及schema oid
select relname,relnamespacefrom(select inhrelid from pg_namespace,pg_class,pg_inherits where pg_namespace.oid=pg_class.relnamespace and pg_namespace.nspname='a' and relname='a' and pg_class.oid=pg_inherits.inhparent) a,pg_class bwhere a.inhrelid=b.oid
2.我们把上一步的sql作为嵌套子查询,即可以得到schema a的表a的子表的schema名称以及表名:
select relname as tablename,nspname as schemanamefrom(select relname,relnamespacefrom(select inhrelid from pg_namespace,pg_class,pg_inherits where pg_namespace.oid=pg_class.relnamespace and pg_namespace.nspname='a' and relname='a' and pg_class.oid=pg_inherits.inhparent) a,pg_class bwhere a.inhrelid=b.oid) c,pg_namespacewhere c.relnamespace=pg_namespace.oid;
结果如下图所示:
0 0
- pg查询表所拥有的子表
- pg学习_子查询
- oracle 查看特定用户所拥有的表
- 如何查看表中所拥有的外键
- 珍惜所拥有的
- 珍惜所拥有的
- 我所拥有的
- PostgreSQL查询优化的分享---PG优化器的框架和子查询
- 两个子字符串中所共同拥有的长度最大的子序列是多长
- ORACLE中查询拥有某字段的表
- 珍惜你所拥有的......
- 珍惜现在所拥有的
- 子查询-表子查询
- 显示PG中的表的每一行
- oracle10g中scott用户所拥有的表 和解锁scott用户
- 表的复杂查询---子查询
- 数据库表的连接查询、子查询
- 查询oracle约束所关联的表
- 第八周拓展实践(2)鸡兔同笼
- 4k hdr 显示传输方案调研
- 标记下关于保留小数的问题
- 并行计算—OpenMP—共享与私有
- 派生类和他的构造函数们
- pg查询表所拥有的子表
- R语言学习笔记(2)
- Leetcode刷题记——20. Valid Parentheses (有效的括号即括号匹配)
- RSA公钥密码算法
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么
- unity3d消除不想要的黄色警告
- 解决 Mac 10.12.1 外接键盘 A 失灵、H/I 互换的问题
- 高德3D版SDK使用
- 文件上传下载