关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
三年前关门了。
改进这个问题
我有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联合起来,如果它们存在的话,就把它们去掉。但这似乎也不是一个明智的选择。还有其他的变种吗?
2条答案
按热度按时间jq6vz3qz1#
你可以用逗号分隔多个cte
rpppsulh2#
如果cols对于您可以使用的所有4个查询都是相同的
更新:要删除重复项,请使用
union
而不是union all
更新2:如果union all
不支持我们可以使用distinct+子查询