【问题标题】:Where did view columns come from in Postgres?Postgres 中的视图列从何而来?
【发布时间】:2020-04-09 10:40:00
【问题描述】:

假设我有一个 PostgreSQL 数据库,并且有一个看起来像这样的视图:

select foo.id as id, bar.id as bar_id, ...
from foo join bar on foo.bar_id = bar.id;

什么查询可以告诉我视图的哪些列来自哪些基础表/列组合?

我最接近的是查询information_schema.view_column_usage。除了定义视图中的哪一列之外,这给了我一切。所以我可以说,例如,foo.idbar.id 都在视图中使用。但我不知道id 列是来自foo 还是bar

(是的,我可以手动解析 SQL。但我正在尝试自动分析具有许多视图、许多列以及视图中的列重命名不明显的系统。)

【问题讨论】:

  • 不可能。 coalesce(a.id, b.id) 呢?或select a.id union select b.id?
  • @JGH 是的,有一些复杂的例子。我希望找出哪些列是依赖的,然后依靠选择通常很容易完成大部分工作这一事实。

标签: database postgresql information-schema


【解决方案1】:

我只需要select * from pg_get_viewdef('view_name'),但显然你还需要更多。

虽然它没有完全解决您的问题,但如果您还没有看到几周前的以下文章,您可能会觉得它很有趣:

滥用 Postgresql 作为 SQL 美化器

https://www.cybertec-postgresql.com/en/abusing-postgresql-as-an-sql-beautifier/

【讨论】:

    【解决方案2】:

    正如 JGH 在他的评论中所说,很容易提出视图列依赖于多个基础对象的视图。

    视图定义本身以解析树的形式存储在对应的pg_rewrite条目的ev_action列中,因此您必须编写C代码并深入PostgreSQL的内部来处理它.但请注意:尝试解析文本表示会更加困难。

    【讨论】:

    • 呃。感谢您让我知道信息在哪里,我不能简单地寻找更多信息来找到它。 :-(
    • @user9645 这无关紧要。查看pg_rewrite
    猜你喜欢
    • 2020-06-14
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多