SQL中Cte中的Cte

SQL中Cte中的Cte,sql,db2,common-table-expression,recursive-query,Sql,Db2,Common Table Expression,Recursive Query,我遇到了一种情况,需要对CTE中的CTE结果应用where、group by条件。 表1如下所示 +---+---+---+---+ | x | y | z | w | +---+---+---+---+ | 1 | 2 | 3 | 1 | | 2 | 3 | 4 | 2 | | 3 | 2 | 5 | 3 | | 1 | 2 | 6 | 2 | +---+---+---+---+ +---+---+-----+---+ | a | b | c | d | +---+---+-----+

我遇到了一种情况,需要对CTE中的CTE结果应用where、group by条件。

表1如下所示

+---+---+---+---+
| x | y | z | w |
+---+---+---+---+
| 1 | 2 | 3 | 1 |
| 2 | 3 | 4 | 2 |
| 3 | 2 | 5 | 3 |
| 1 | 2 | 6 | 2 |
+---+---+---+---+
+---+---+-----+---+
| a | b |  c  | d |
+---+---+-----+---+
| 1 | m | 100 | 1 |
| 2 | n |  23 | 2 |
| 4 | o |  34 | 4 |
| 1 | m |  23 | 2 |
+---+---+-----+---+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 2 | 3 | 4 | 2 | n |  23 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
表2如下所示

+---+---+---+---+
| x | y | z | w |
+---+---+---+---+
| 1 | 2 | 3 | 1 |
| 2 | 3 | 4 | 2 |
| 3 | 2 | 5 | 3 |
| 1 | 2 | 6 | 2 |
+---+---+---+---+
+---+---+-----+---+
| a | b |  c  | d |
+---+---+-----+---+
| 1 | m | 100 | 1 |
| 2 | n |  23 | 2 |
| 4 | o |  34 | 4 |
| 1 | m |  23 | 2 |
+---+---+-----+---+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 2 | 3 | 4 | 2 | n |  23 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
假设我在一个名为TAB的表中有以下sql查询的数据

with cte as (
select x,y,z from table1),
cte1 as (select a,b,c from table2)
select cte.x,cte1.y,cte1.z,cte2.b,cte2.c from cte left join cte1 on cte.x=cte.a and cte1.w=cte2.d
上述CTE的结果如下

+---+---+---+---+
| x | y | z | w |
+---+---+---+---+
| 1 | 2 | 3 | 1 |
| 2 | 3 | 4 | 2 |
| 3 | 2 | 5 | 3 |
| 1 | 2 | 6 | 2 |
+---+---+---+---+
+---+---+-----+---+
| a | b |  c  | d |
+---+---+-----+---+
| 1 | m | 100 | 1 |
| 2 | n |  23 | 2 |
| 4 | o |  34 | 4 |
| 1 | m |  23 | 2 |
+---+---+-----+---+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 2 | 3 | 4 | 2 | n |  23 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+

我想从表选项卡查询以下内容
select * from TAB where (X||b) in (select (X||b) from TAB group by (X||Y) having sum(c)=123)

我正试图按如下方式表述SQL查询,但它并不像我预期的那样:
select * from (

with cte as (
select x,y,z from table1),
cte1 as (select a,b,c from table2)
select cte.x,cte1.y,cte1.z,cte2.b,cte2.c from cte left join cte1 on cte.x=cte.a) as TAB 

where ((X||b) in (select (X||b) from TAB group by (X||Y) having sum(c)=123))
最终结果必须如下所示

+---+---+---+---+
| x | y | z | w |
+---+---+---+---+
| 1 | 2 | 3 | 1 |
| 2 | 3 | 4 | 2 |
| 3 | 2 | 5 | 3 |
| 1 | 2 | 6 | 2 |
+---+---+---+---+
+---+---+-----+---+
| a | b |  c  | d |
+---+---+-----+---+
| 1 | m | 100 | 1 |
| 2 | n |  23 | 2 |
| 4 | o |  34 | 4 |
| 1 | m |  23 | 2 |
+---+---+-----+---+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 2 | 3 | 4 | 2 | n |  23 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+
+---+---+---+---+---+-----+
| x | y | z | w | b |  c  |
+---+---+---+---+---+-----+
| 1 | 2 | 3 | 1 | m | 100 |
| 1 | 2 | 6 | 2 | m |  23 |
+---+---+---+---+---+-----+

我认为DB2不允许在子查询中使用CTE,也不允许嵌套CTE。为什么不直接用另一个CTE来写呢

with cte as (
      select x,y,z from
      table1
     ),
     cte1 as (
      select a,b,c
      from table2
     ),
     tab as (
      select cte.x,cte1.y,cte1.z,cte1.w,cte2.b,cte2.c
      from cte left join
           cte1
           on cte.x=cte.a and cte1.w=cte2.d
     )
select *
from TAB
where (X||b) in (select (X||b) from TAB group by (X||Y) having sum(c)=123);

输入数据是什么,预期结果是什么?通常,你不需要那种复杂性。你可以嵌套表达式。CTE的用途是什么?@data\u henrik实际上,table1和table2查询包含交叉连接和联合所有选项,因此需要CTE来连接所有这些结果。据我所知,你根本不需要CTE,你只是连接了两个集合