【发布时间】:2023-03-05 09:23:02
【问题描述】:
如果有一个使用子查询的查询。基本上是这样的:
SELECT A.name, A.pk
array_to_string(array(SELECT B.name FROM b WHERE B.relA = A.pk ),', ')
FROM A;
基本上它在A 中创建一个与B 的一对多关系的列。 (在我的例子中,A 是一个项目列表,B 包含与该项目相关的标签。查询创建一个列,其中包含A 中每一行的标签列表。)
由于现实世界的查询更复杂,而且我多次需要子查询,我想从子查询 (DRY) 中创建一个视图。这是不可能的,因为A.pk 仅在子查询是从A 获取的主查询中的子查询时才知道。不知道子查询是否独立。所以我无法从单机版创建视图:
CREATE VIEW bview AS SELECT B.b FROM B WHERE B.relA=A.pk;
给了我预期的:
ERROR: missing FROM-clause entry for table "A"
有没有一种方法可以定义类似于“不完整视图”,它本身不执行,而是在不使用函数的情况下完成子查询的主查询?
编辑:子查询中的WHERE 子句不能用JOIN 子句替换,因为它从外部查询中获取A.pk。
【问题讨论】:
-
或者你可以使用 CREATE VIEW bview AS SELECT A.pk, B.b FROM B JOIN A ON B.relA = A.pk;它:
SELECT * FROM bview WHERE <where clause> -
@RomanTkachuk 这不一样,因为它在子查询中创建了一个新的关系。但它应该从主查询中获取
A.pk。我在 Q 中添加了 n 个解释。
标签: postgresql subquery sql-view