如何用一个cte获得结果?

时间:2017-04-14 07:13:54

标签: sql hive

我有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去除如果它们存在则加倍。但这似乎也不是一个明智的选择。还有其他变种吗?

2 个答案:

答案 0 :(得分:0)

你可以使用逗号

来获得多个cte的separetad
WITH 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