PostgreSQL 9.3 : LATERAL

昨日、PostgreSQL 9.3 rc1がリリースされた(PostgreSQL: PostgreSQL 9.3 RC1 Available for Testing)ので、早速DLして愛機のVM上でビルド&インストールしてみた。

そういえばbetaの時には公式のリリースノートを見てなかったけど、今回アップデートされたので、リリースノートも見てみた。
そこに見慣れぬ?キーワードが・・・(ここ数ヶ月のセミナーなんかで紹介されていたのかもしれないけど、あんまり記憶になかっただけだろうけど)。

Implement SQL-standard LATERAL option for FROM-clause subqueries and function calls

つーか、SQL標準にあったのか。これ、FROM句に指定した名標をFROM句より後のサブクエリや関数内で参照できるようになったってことなのかな。
早速、pgbenchのデータを使って試してみる。

bench=# SELECT aid, abalance, br.bid, br.bbalance FROM pgbench_accounts as ac, 
        LATERAL (SELECT bid, bbalance FROM pgbench_branches as br WHERE ac.bid = br.bid) as br limit 3;
 aid | abalance | bid | bbalance 
-----+----------+-----+----------
   1 |        0 |   1 |        0
   2 |        0 |   1 |        0
   3 |        0 |   1 |        0
(3 rows)

ふむ。
で、LATERALオプションがないとエラーになると。

bench=# SELECT aid, abalance, br.bid, br.bbalance FROM pgbench_accounts as ac, 
        (SELECT bid, bbalance FROM pgbench_branches as br WHERE ac.bid = br.bid) as br limit 3;
ERROR:  invalid reference to FROM-clause entry for table "ac" at character 130
HINT:  There is an entry for table "ac", but it cannot be referenced from this part of the query.
STATEMENT:  SELECT aid, abalance, br.bid, br.bbalance FROM pgbench_accounts as ac, 
		(SELECT bid, bbalance FROM pgbench_branches as br WHERE ac.bid = br.bid) as br limit 3;

ふむ。
こういうクエリを書く機会があると、ちょっとだけ嬉しい機能かも。