从子查询中保存价值并在以后重用它?

Posted

技术标签:

【中文标题】从子查询中保存价值并在以后重用它?【英文标题】:Save value from sub query and reuse it later? 【发布时间】:2019-01-28 11:51:55 【问题描述】:

如何多次使用子查询的结果?有没有办法命名该结果并在其他地方使用它?我知道 xyz as ... 但这似乎不起作用?

我找到了this,想要更具体的内容吗?

损坏代码示例:

with g_surf as (select surface_area from countries where name like 'Germa%')
select abs(surface_area - g_surf) from countries;

使用整个子查询的工作代码:

select abs(surface_area - (select surface_area from
    countries where name like 'Germa%')) from countries;

【问题讨论】:

称为CTE(公用表表达式)。也许如果你发布你的尝试,我们可以告诉你为什么没有成功。 PostgreSQL table variable的可能重复 您成为会员的时间已经足够长,知道我们需要更多,对吧?代码、尝试、错误等。此外,如果您链​​接某些内容,请包含/引用重要位,以便当链接失效时,问题不会。 - 编辑:并可能使用pg_fetch_all 并将子查询结果保存为独立查询? @rkeet 可以吗? g_surf 是 CTE,即它就像一个表格,而不是一个字段。因此:with g_surf as (select surface_area from countries where name like 'Germa%') select abs(surface_area) from g_surf;当然,如果你的countries表中有g_surf字段,你可以写with myCTE as (select surface_area, g_surf from countries where name like 'Germa%') select abs(surface_area - g_surf) from myCTE; 【参考方案1】:

只是为了将问题标记为已解决:g_surf,在您的示例中,是 CTE(通用 表格 表达式),即它充当表格,而不是字段。

with g_surf as (select surface_area from countries where name like 'Germa%')
select abs(surface_area) from g_surf; 

当然,如果您的countries 表中有g_surf 字段,您可以这样写:

with myCTE as (select surface_area, g_surf from countries where name like 'Germa%')
select abs(surface_area - g_surf) from myCTE;

更多关于 CTE here.

【讨论】:

非常感谢。我会尽快检查一下。 等等,在你的第一个例子中,没有减法? (所以它真的做到了我打算做的事情)现在在你的第二个例子中,surface_area 如何知道它来自国家,而 g_surf 如何知道它来自 myCTE? 是因为你的破代码有点奇怪……你写with g_surf as (select surface_area from countries where name like 'Germa%')的时候很粗略的说:创建一个临时表g_surf,其唯一的字段是surface_area(没有g_surf 列)。但是,select abs(surface_area - g_surf) from countries 建议的g_surf 部分是表countries 中的列标识符。我只是不知道什么假设是正确的。如果第二个查询有效,我想这就是您要查找的内容。 好吧,那我来解释一下。 “工作代码”示例是我的目标。我想选择、排序并在表面积的差异上使用 where,我只想写一次子查询。我今天会检查你的代码。感谢您的帮助!

以上是关于从子查询中保存价值并在以后重用它?的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE-Clause for INSERT 中重用子查询结果

查询语言系列—JOIN 语句

如何从子查询中返回两个字段

如何根据查询从子文档数组中更新子文档字段?

从子查询存储过程分配变量

如何从子查询中获取结果作为查询中的参数