【问题标题】:How to create a view in PostgreSQL containing ARRAY?如何在 PostgreSQL 中创建包含 ARRAY 的视图?
【发布时间】:2019-10-04 21:49:34
【问题描述】:

我有一个问题,我目前正在使用 Postgres 数据库,我想做的是从两个表创建一个视图。问题是其中一个表包含“varchar ARRAY”类型的列。此列包含某种 ID,可用于从第二个表中获取信息。

我有以下几点:

表 1:人

  • primary_name : varchar
  • known_for_titles : varchar ARRAY(t_const 数组)表 2:

表 2:电影

  • t_const : varchar
  • primary_title : varchar

我想创建一个如下所示的视图(actorView): -primary_name : varchar - Famous_for : varchar ARRAY(标题数组)

我的这个 SQL 不能正常工作,我设法创建了视图,但我不能单独使用 select 语句,也不能对视图进行查询。

CREATE or REPLACE VIEW actorView AS
    SELECT p.primary_name,
           array_agg(t.primary_title) as famous_titles
FROM person p JOIN title t
                   ON t.t_const = any(p.known_for_titles)
    group by primary_name

当我尝试 SQL 语句的 select 部分时,它只是在无限循环中搜索,我必须终止查询。

当我使用整个语句时也会发生同样的事情。它以某种方式设法创建了表,但我无法搜索任何内容。

【问题讨论】:

  • 查看@TAM 的回答。如果您不将所有内容命名为小写,您可能会在 PostgreSQL 中遇到问题。有关详细信息,请参阅this post

标签: postgresql database-design sql-view


【解决方案1】:

我对您的代码做了以下修改:

  • 将表名改为小写,
  • 将 t_const 设为主键,允许在 pgAdmin 中输入数据
  • 添加了一个 bigint id 作为 person 的主键。

另外,我不得不将名称标题更改为电影以确认您的表名。 (可能您在帖子中的表格描述不准确:-()

然后,这句话

create or replace view actor_view as

SELECT p.primary_name,
           array_agg(t.primary_title) as famous_titles
FROM person p JOIN movie t
                   ON t.t_const = any(p.known_for_titles)
    group by primary_name

为我成功运行。

您和我的解决方案之间的唯一实质性区别是主键 - 我猜其余的只是您发布的拼写错误。我不知道这些 pk 是否有所作为,但无论如何拥有它们并没有什么坏处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 2021-08-15
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多