sql—如何使用单个cte获得结果?

lmyy7pcs  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(278)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

三年前关门了。
改进这个问题
我有4个查询,每个查询以cte开头:

with stg as
(
    select columns
    from stage
    where conditions1
)

在这之后,分歧就开始了。在第一种情况下,我需要在某些条件下连接两个表

select cols
from stg
inner join table1 on cond2
inner join table2 on cond3
where con4

在第二。我需要加入表2,但条件不同

select cols
from stg
inner join table2 on cond5
where cond6

在第三个例子中,我只需要所有符合cond7的列

select cols
from stg
where cond7

在第四个,又是不同的table和条件

select cols
from stg
left join table3 on cond8
where cond9

问题是,每次查询之后,我都需要将更改后的数据插回。基本上是

insert into table stage
    select *
    from query(1-4)

所以我不能把这个锁起来。在每次插入之后,cte返回的行更少。例如
第一次返回100行,第二次返回85行,以此类推。我想要的是只使用一次cte的方法。起初,我考虑将all join更改为left join,将它们添加到cte本身并创建一个排序标志

with stg as
(
    select 
        cols,
        table1.col as flag1,
        table2.col as flag2,
        table3.col as flag3
    from 
        stage
    left join 
        table1 on cond
    left join 
        table2 on cond
    left join 
        table3 on cond
    where 
        many conditions
)

但这变得非常混乱,非常快,甚至没有工作的权利。然后我想把它链起来,然后把4个CTE联合起来,如果它们存在的话,就把它们去掉。但这似乎也不是一个明智的选择。还有其他的变种吗?

jq6vz3qz

jq6vz3qz1#

你可以用逗号分隔多个cte

WITH cte1 AS (SELECT ... FROM ...),
     cte2 AS (SELECT ... FROM cte1 INNER JOIN ...),
     cte3 AS (SELECT ... FROM cte2 INNER JOIN ...)

SELECT * FROM cte3
rpppsulh

rpppsulh2#

如果cols对于您可以使用的所有4个查询都是相同的

Q1
union all
Q2
union all
Q3
union all
Q4

更新:要删除重复项,请使用 union 而不是 union all 更新2:如果 union all 不支持我们可以使用distinct+子查询

select distinct *
from (Q1
      union all
      Q2
      union all
      Q3
      union all
      Q4) sub

相关问题