如何在 postgres 中对相同的 CTE 表达式执行 UNION ALL?

Posted

技术标签:

【中文标题】如何在 postgres 中对相同的 CTE 表达式执行 UNION ALL?【英文标题】:How to perform UNION ALL on same CTE expression in postgres? 【发布时间】:2021-04-16 09:17:09 【问题描述】:

我最初创建了 CTE,然后使用联合操作选择查询,因为我想要重复的行。

with a as (select emp_name,empdept from emp)
 select * from a
union all
with a as (select emp_name,empdept from emp)
select * from a

我在“WITH”处或附近收到错误**语法错误**

【问题讨论】:

【参考方案1】:

不确定您要达到的目标,但以下应该可行

让我们创建表并插入一些行

create table emp (emp_name varchar,empdept int);
insert into emp values ('Pippo',1000);
insert into emp values ('Pluto',3000);
insert into emp values ('Franco',4000);

现在查询

with a as (select emp_name,empdept from emp),
b as (select emp_name,empdept from emp)
select * from a
union all
select * from b;

结果

 emp_name | empdept 
----------+---------
 Pippo    |    1000
 Pluto    |    3000
 Franco   |    4000
 Pippo    |    1000
 Pluto    |    3000
 Franco   |    4000
(6 rows)

【讨论】:

【参考方案2】:

这是需要用括号将 UNION 的每个查询括起来的罕见情况之一:

(
  with a as (select emp_name,empdept from emp)
  select * from a
)
union all
(
  with a as (select emp_name,empdept from emp)
  select * from a
)

但为什么要重复 CTE?

with a as (
  select emp_name,empdept from emp
)
select * from a
union all
select * from a

Online example


如果你在两个 CTE 中有两个不同的查询,你仍然可以这样做:

with a as (
  select emp_name,empdept from emp1
), b as (
  select emp_name,empdept from emp2
)
select * from a
union all
select * from b

Online example

【讨论】:

如果我不重复 CTE,它会给我一个错误 @anukritikulshrestha works for me

以上是关于如何在 postgres 中对相同的 CTE 表达式执行 UNION ALL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Data JPA 中使用 CTE 表达式 WITH 子句

在 CTE 中对日期范围内的列求和?

如何在 postgres 中对 jsonb 值求和?

Postgres - 使用 CTE 的 id 列的唯一值,与 GROUP BY 一起加入

具有递归 CTE 的 Postgres:在保留树结构的同时按受欢迎程度对子节点进行排序/排序(父节点始终高于子节点)

如何在 Postgres 中对数组列使用 BETWEEN 条件?