Subconsultas correlacionadas - Amazon Redshift

Subconsultas correlacionadas

En el siguiente ejemplo, se observa una subconsulta correlacionada en la cláusula WHERE; este tipo de subconsulta contiene una o varias correlaciones entre sus columnas y las columnas producidas por la consulta externa. En este caso, la correlación es where s.listid=l.listid. Para cada fila que la consulta externa produce, se ejecuta la subconsulta para calificar o descalificar la fila.

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)

Patrones de subconsultas correlacionadas que no se admiten

El planificador de consultas usa un método de reescritura de consulta denominado descorrelación de subconsulta para optimizar varios patrones de subconsultas correlacionadas para la ejecución en un entorno MPP. Algunos tipos de subconsultas correlacionadas siguen patrones para los cuales Amazon Redshift no puede anular la correlación y que no admite. Las consultas que contienen las siguientes referencias de correlación devuelven errores:

  • Referencias de correlación que omiten un bloque de consulta, también conocidas como "referencias de correlación con nivel omitido". Por ejemplo, en la siguiente consulta, el bloque que contiene la referencia de correlación y el bloque omitido están conectados por un predicado NOT EXISTS:

    select event.eventname from event where not exists (select * from listing where not exists (select * from sales where event.eventid=sales.eventid));

    En este caso, el bloque omitido es la subconsulta que se ejecuta contra la tabla LISTING. La referencia de correlación correlaciona las tablas EVENT y SALES.

  • Referencias de correlación de una subconsulta que es parte de una cláusula ON en una consulta externa:

    select * from category left join event on category.catid=event.catid and eventid = (select max(eventid) from sales where sales.eventid=event.eventid);

    La cláusula ON contiene una referencia de correlación de SALES en la subconsulta a EVENT en la consulta externa.

  • La correlación que distingue valores nulos referencia una tabla de sistema de Amazon Redshift. Por ejemplo:

    select attrelid from stv_locks sl, pg_attribute where sl.table_id=pg_attribute.attrelid and 1 not in (select 1 from pg_opclass where sl.lock_owner = opcowner);
  • Referencias de correlación de una subconsulta que contiene una función de ventana.

    select listid, qtysold from sales s where qtysold not in (select sum(numtickets) over() from listing l where s.listid=l.listid);
  • Referencias en una columna GROUP BY a los resultados de una subconsulta correlacionada. Por ejemplo:

    select listing.listid, (select count (sales.listid) from sales where sales.listid=listing.listid) as list from listing group by list, listing.listid;
  • Referencias de correlación de una subconsulta con una función agregada y una cláusula GROUP BY, conectadas a la consulta externa por un predicado IN. (Esta restricción no se aplica a las funciones agregadas MIN y MAX). Por ejemplo:

    select * from listing where listid in (select sum(qtysold) from sales where numtickets>4 group by salesid);