我有4个查询,每个查询以CTE开头:
with stg as
(
select columns
from stage
where conditions1
)
此后差异开始。在第一种情况下,我需要在某些条件下加入2个表
select cols
from stg
inner join table1 on cond2
inner join table2 on cond3
where con4
第二名。我需要加入table2,但是在不同的条件下
select cols
from stg
inner join table2 on cond5
where cond6
在第三个中,我只需要符合cond7的所有列
select cols
from stg
where cond7
在第四个,又一个不同的表和cond
select cols
from stg
left join table3 on cond8
where cond9
问题是,在每次查询后我都需要重新插入更改后的数据。它基本上是
insert into table stage
select *
from query(1-4)
所以我无法连锁这个CTE。每次插入后,cte返回的行数减少。例如
第一次它将返回100行,第二次返回85,依此类推。我想要的只是一次使用CTE的方法。起初我想过将所有连接更改为左连接,将它们添加到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去除如果它们存在则加倍。但这似乎也不是一个明智的选择。还有其他变种吗?
答案 0 :(得分:0)
你可以使用逗号
来获得多个cte的separetadWITH cte1 AS (SELECT ... FROM ...),
cte2 AS (SELECT ... FROM cte1 INNER JOIN ...),
cte3 AS (SELECT ... FROM cte2 INNER JOIN ...)
SELECT * FROM cte3
答案 1 :(得分:0)
如果所有4个查询的cols相同,则可以使用
Q1
union all
Q2
union all
Q3
union all
Q4
更新:要删除重复项,请使用union
代替union all
UPDATE2:如果不支持union all
,我们可以使用distinct +子查询
select distinct *
from (Q1
union all
Q2
union all
Q3
union all
Q4) sub