本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
关联的子查询
以下示例在子WHERE句中包含一个相关的子查询;这种子查询包含其列与外部查询生成的列之间的一种或多种相关性。在本示例中,关联为 where
s.listid=l.listid
。对于外部查询生成的每一行,将执行子查询以限定或取消限定行。
select salesid, listid, sum(pricepaid) from sales s where qtysold= (select max(numtickets) from listing l where s.listid=l.listid) group by 1,2 order by 1,2 limit 5; salesid | listid | sum --------+--------+---------- 27 | 28 | 111.00 81 | 103 | 181.00 142 | 149 | 240.00 146 | 152 | 231.00 194 | 210 | 144.00 (5 rows)
不支持的关联子查询模式
查询计划器使用一种名为 subquery decorrelation 的查询重写方法来优化几种关联子查询模式,以便在环境中执行。MPP有几种类型的关联子查询遵循 AWS Clean Rooms 无法取消关联且不支持的模式。包含以下关联引用的查询会返回错误:
-
跳过查询块的关联引用,也称为“跨级关联引用”。例如,在以下查询中,包含关联引用的块和跳过的块通过NOTEXISTS谓词连接:
select event.eventname from event where not exists (select * from listing where not exists (select * from sales where event.eventid=sales.eventid));
在本例中,跳过的块是针对表的子查询。LISTING关联参考将EVENT和SALES表关联起来。
-
来自作为外部查询中 ON 子句的一部分的子查询的关联引用:
select * from category left join event on category.catid=event.catid and eventid = (select max(eventid) from sales where sales.eventid=event.eventid);
ON 子句包含从SALES子查询到外部查询EVENT的关联引用。
-
对 AWS Clean Rooms 系统表的空敏感关联引用。例如:
select attrelid from my_locks sl, my_attribute where sl.table_id=my_attribute.attrelid and 1 not in (select 1 from my_opclass where sl.lock_owner = opcowner);
-
来自包含窗口函数的子查询内部的关联引用。
select listid, qtysold from sales s where qtysold not in (select sum(numtickets) over() from listing l where s.listid=l.listid);
-
在 BY GROUP 列中引用相关子查询的结果。例如:
select listing.listid, (select count (sales.listid) from sales where sales.listid=listing.listid) as list from listing group by list, listing.listid;
-
来自具有聚合函数和 BY 子句的子查询的关联引用,GROUP通过 IN 谓词连接到外部查询。(此限制不适用于MAX聚MIN合函数。) 例如:
select * from listing where listid in (select sum(qtysold) from sales where numtickets>4 group by salesid);