在执行以下语句后,我在雪花中遇到错误,提示“无法评估不支持的子查询类型”。应该如何写这个语句才能避免这个错误?
选择A
从 (
选择b
,c
来自测试表
);
外部查询列列表需要位于子查询的列列表内。示例:select b from (select b,c from test_table);
忽略您显示的查询的“列”将永远不会触发此错误。
您可以通过此表格获得:
select A.*
from tableA as A
where a.x = (select b.y FROM test_table as b where b.z = a.z)
这种形式假设每个
b.y
只有 1 个 b.z
可以变成像这样的内部连接
select A.*
from tableA as A
join test_table as b
on b.z = a.z and a.x = b.y
此模式的其他形式类似于
max(b.y)
,并且可以将它们制作成子选择,例如:
select A.*
from tableA as A
join (
select c.z, max(c.y) from test_table as c group by 1
) as b
on b.z = a.z and a.x = b.y
但一般模式是,在其他数据库中,进行逐行查询是没有“成本”的,而 Snowflake 更适合预先构建相似数据的表,然后将这些结果等连接在一起。因此,“如何编写”示例都从针对每一行的思维转向构建所有可能答案的集合,然后将其加入。这允许尽可能并行地处理数据。虽然这意味着您开发人员需要了解您的数据以获得最佳性能,但一般来说,如果您正在进行大规模数据处理,您应该了解您的数据。所以这个成本,恕我直言,是可以接受的。
如果您尝试匹配子查询上的两个属性。
使用如下:
如果两者都需要匹配:
从表中选择*,其中a IN(从test_table中选择b)ANDa IN(从test_table中选择c)
如有需要匹配的:
从表中选择*,其中a IN(从test_table中选择b)ORa IN(从test_table中选择c)