sql - 我可以在同一个 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,一次是另一个条件,所以我得到两个表作为结果。有没有办法做到这一点(以两个查询而不是一个查询结束)还是我必须为我想要作为输出的每个表重新运行整个代码?
解决方案
一个查询 = 一个结果集。这正是 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,它只需执行一次该步骤)。因此,仍然无法从单个查询中获得第二个结果集。
推荐阅读
- python - 如何使用搜索栏抓取有关特定产品的信息
- java - 步骤冻结。当文件很大时,PoiItemreader 不会读取 excel 文件。有什么建议吗?
- ios - UITableView 高度在运行时不会通过 SnapKit 的按钮操作而改变
- python - 为什么当 2*2 的输出矩阵初始化为零并分配输出时,用于 2*2 矩阵加法的 python 程序为两行提供相同的输出?
- r - 标记用 grid.arrange 排列的图
- typescript - Is it possible to mimic webpack custom module resolution in TypeScript?
- ios - 无法将“Swift.__SwiftDeferredNSArray”(0x104cd8ae8)类型的值转换为“NSMutableArray”(0x7fff87c52960)
- javascript - 为什么 axios 在解析推特搜索 api 响应后会以某种方式修改推文的 id?
- asp.net - 我可以像 Tinymce 一样将 Gutenberg 文本编辑器与 Asp.net 明确集成吗?
- javascript - 在图片网址中添加字符串