如何通过子表名称及Schema查询父表名称的SQL语句?
获取PostgreSQL继承表的父表信息的SQL查询
针对你需要通过子表的Schema和名称查询父表详情(名称)的需求,PostgreSQL的系统目录表刚好能解决这个问题——毕竟继承关系是存在系统元数据里的。
核心查询语句
如果你已经明确知道子表的Schema(比如smt)和表名(比如sub_items),可以用这个精准查询:
SELECT n.nspname AS parent_schema, c.relname AS parent_table FROM pg_inherits i JOIN pg_class c ON i.inhparent = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_class sc ON i.inhrelid = sc.oid JOIN pg_namespace sn ON sc.relnamespace = sn.oid WHERE sn.nspname = 'smt' -- 子表的Schema AND sc.relname = 'sub_items'; -- 子表的名称
语句解释
pg_inherits:PostgreSQL专门存储表继承关系的系统表,inhrelid是子表的唯一标识OID,inhparent是对应的父表OIDpg_class:存储所有数据库对象(表、索引等)的基本信息,relname就是我们要的表名,oid是关联用的唯一标识pg_namespace:存储Schema(命名空间)的信息,nspname对应Schema名称
针对你的表结构验证
用你提供的建表语句创建的smt.sub_items继承自smt.items,执行上面的查询后,会返回:
| parent_schema | parent_table |
|---|---|
| smt | items |
如果需要更通用的查询(比如列出所有继承表及其父表),可以去掉WHERE条件:
SELECT sn.nspname AS child_schema, sc.relname AS child_table, n.nspname AS parent_schema, c.relname AS parent_table FROM pg_inherits i JOIN pg_class c ON i.inhparent = c.oid JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_class sc ON i.inhrelid = sc.oid JOIN pg_namespace sn ON sc.relnamespace = sn.oid;
内容的提问来源于stack exchange,提问作者data_addict
相关产品推荐
相关产品推荐

