Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Sottoquery correlate
L'esempio seguente contiene una sottoquery correlata nella clausola WHERE; questo tipo di sottoquery contiene una o più correlazioni tra le sue colonne e le colonne prodotte dalla query esterna. In questo caso, la correlazione è where s.listid=l.listid
. Per ogni riga prodotta dalla query esterna, la sottoquery viene eseguita per qualificare o squalificare la riga.
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)
Modelli di sottoquery correlate non supportate
Il pianificatore di query utilizza un metodo di riscrittura delle query denominato decorrelazione delle sottoquery per ottimizzare diversi modelli di sottoquery correlate per l'esecuzione in un ambiente MPP. Alcuni tipi di sottoquery correlate seguono modelli che Amazon Redshift non può decorrelare e non supporta. Le query che contengono i seguenti riferimenti di correlazione restituiscono errori:
-
Riferimenti di correlazione che ignorano un blocco di query, noti anche come "riferimenti di correlazione ignorati". Ad esempio, nella seguente query, il blocco contenente il riferimento di correlazione e il blocco ignorato sono collegati da un predicato NOT EXISTS:
select event.eventname from event where not exists (select * from listing where not exists (select * from sales where event.eventid=sales.eventid));
Il blocco ignorato in questo caso è la sottoquery rispetto alla tabella LISTING. Il riferimento di correlazione correla le tabelle EVENT e SALES.
-
Riferimenti di correlazione di una sottoquery che fa parte di una clausola ON in una query esterna:
select * from category left join event on category.catid=event.catid and eventid = (select max(eventid) from sales where sales.eventid=event.eventid);
La clausola ON contiene un riferimento di correlazione da SALES nella sottoquery a EVENT nella query esterna.
-
Riferimenti di correlazione che rispettano i valori null a una tabella di sistema di Amazon Redshift. Ad esempio:
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);
-
Riferimenti di correlazione da una sottoquery contenente una funzione finestra.
select listid, qtysold from sales s where qtysold not in (select sum(numtickets) over() from listing l where s.listid=l.listid);
-
Riferimenti in una colonna GROUP BY ai risultati di una sottoquery correlata. Ad esempio:
select listing.listid, (select count (sales.listid) from sales where sales.listid=listing.listid) as list from listing group by list, listing.listid;
-
Riferimenti di correlazione da una sottoquery con una funzione di aggregazione e una clausola GROUP BY, connessi alla query esterna da un predicato IN. Questa restrizione non si applica alle funzioni di aggregazione MIN e MAX. Per esempio:
select * from listing where listid in (select sum(qtysold) from sales where numtickets>4 group by salesid);