有用的PostgreSQL可以查询系统目录表。
您还可以查询information_schema,它由提供显示信息的标准SQL方式的视图组成。尽管如此,查询系统目录通常要快得多。
为了找到一个特定parent
列的孩子:
SELECT n.nspname AS parrent_schema
, c.relname AS parrent_table
, a.attname AS parrent_column
, n1.nspname AS child_schema
, c1.relname AS child_table
, a1.attname AS child_column
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
JOIN pg_catalog.pg_attribute a1 ON a.attname = substring(a1.attname, '_(.*?)$')
JOIN pg_catalog.pg_class c1 ON c1.oid = a1.attrelid
JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace
WHERE c.relkind = 'r'
AND c1.relkind = 'r'
AND n.nspname !~~ E'pg\\_%'
AND n1.nspname !~~ E'pg\\_%'
AND NOT a.attisdropped
AND NOT a1.attisdropped
-- AND n.nspname = 'public' -- to narrow it down to a specific schema
-- AND n1.nspname = 'public' -- to narrow it down to a specific schema
ORDER BY 1,2,3,4,5,6
这假定parrent列没有:
SELECT n.nspname AS schema_name
, c.relname AS table_name
, a.attname AS column_name
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE a.attname ~~ E'%\\_parent'
AND NOT a.attisdropped
AND c.relkind = 'r'
AND nspname !~~ E'pg\\_%';
要根据描述找到所有列相关_
的名字。
关键因素是连接条件:
a.attname = substring(a1.attname, '_(.*?)$')
'information_schema.columns' PostgreSQL中也有效。 – 2012-01-16 08:46:41
感谢您的信息。很高兴知道。 – 2012-01-16 09:25:39
我做了类似'select table_name,column_name from information_schema.columns where column_name like'%_parent'and table_catalog ='sat';',它解决了我的问题。谢谢 – nemesisfixx 2012-01-16 10:14:10