首页 > 解决方案 > 我可以在同一个 WITH 查询中选择多个表吗?

问题描述

我有一个with结构很长的查询。最后,我想输出两个表。这可能吗?

(顺便说一下,表和查询都在雪花 SQL 中。)

代码如下所示:

with table_a as (
               select id, 
                      product_a
               from x.x ),
     table_b as (
               select id, 
                      product_b
               from x.y ),
     table_c as ( 

..... many more alias tables and subqueries here .....

             )

select * from table_g where z = 3 ;

但是对于最后一行,我想查询 table_g 两次,一次是 z = 3,一次是另一个条件,所以我得到两个表作为结果。有没有办法做到这一点(以两个查询而不是一个查询结束)还是我必须为我想要作为输出的每个表重新运行整个代码?

标签: sqlsnowflake-cloud-data-platform

解决方案


一个查询 = 一个结果集。这正是 RDBMS 的工作方式。

CTE(WITH语句)只是子查询的语法糖。

例如,类似于您的查询:

with table_a as (
               select id, 
                      product_a
               from x.x ),
     table_b as (
               select id, 
                      product_b
               from x.y ),
     table_c as (     
               select id, 
                      product_c
               from x.z ),

select * 
from table_a
   inner join table_b on table_a.id = table_b.id
   inner join table_c on table_b.id = table_c.id;

100% 等同于:

select *
from
  (select id, product_a from x.x) table_a
  inner join (select id, product_b from x.y) table_b
      on table_a.id = table_b.id
  inner join (select id, product_c from x.z) table_c
      on table_b.id = table_c.id

CTE 版本没有为您提供非 cte 版本中不可用的任何额外功能(递归 cte 除外),执行路径将 100% 相同(编辑:请参阅 Simon 的回答和评论在下面他指出,Snowflake 可能会具体化由 CTE 定义的派生表,因此如果在主查询中多次引用 CTE,它只需执行一次该步骤)。因此,仍然无法从单个查询中获得第二个结果集。


推荐阅读