メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

相関性のあるサブクエリ

次の例の WHERE 句には、相関性のあるサブクエリが含まれています。このタイプのサブクエリには、サブクエリの列と他のクエリが生成した列の間に相関性があります。この場合、相関は where s.listid=l.listid となります。外部クエリが生成する各行に対してサブクエリが実行され、行が適正か適正でないかが判断されます。

Copy to clipboard
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)

サポートされていない相関サブクエリのパターン

クエリのプランナーは、MPP 環境で実行する相関サブクエリの複数のパターンを最適化するため、「サブクエリ相関解除」と呼ばれるクエリ再生成メソッドを使用します。相関サブクエリの中には、Amazon Redshift が相関を解除できずサポートすることができないパターンを採用しているものがわずかにあります。次の相関参照を含んでいるクエリがエラーを返します。

  • クエリブロックをスキップする相関参照 (「スキップレベル相関参照」とも呼ばれています) 例えば、次のクエリでは、相関参照とスキップされるブロックを含むブロックは、NOT EXISTS 述語によって接続されます。

    Copy to clipboard
    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 句の一部であるサブクエリからの相関参照:

    Copy to clipboard
    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 への相関参照が含まれています。

  • Amazon Redshift システムテーブルに対する NULL センシティブな相関参照。以下に例を示します。

    Copy to clipboard
    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);
  • ウィンドウ関数を含んでいるサブクエリ内からの相関参照。

    Copy to clipboard
    select listid, qtysold from sales s where qtysold not in (select sum(numtickets) over() from listing l where s.listid=l.listid);
  • 相関サブクエリの結果に対する、GROUP BY 列の参照。以下に例を示します。

    Copy to clipboard
    select listing.listid, (select count (sales.listid) from sales where sales.listid=listing.listid) as list from listing group by list, listing.listid;
  • 集計関数と GROUP BY 句のあり、IN 述語によって外部クエリに接続されているサブクエリからの相関参照。 (この制限は、MIN と MAX 集計関数には適用されません。) 以下に例を示します。

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