OUTER JOIN

LEFT/RIGHT OUTER JOINの挙動について。

定義によると、LEFT OUTER JOINの場合は左側テーブルの全てのタプルに対して、結合条件に対応する右側タプルが存在しない場合には、右側テーブルに対応する部分をNULLで埋めた結果セットを返却する。
つまり、ON〜句で左側タプルを絞り込む条件を設定しても意味がなく、無条件で出力されてしまう。

従来、SE-PostgreSQLの構文書き換えシステムは以下のような処理を行っていた。

SELECT * FROM t1 LEFT OUTER JOIN t2;
↓
SELECT * FROM t1 LEFT OUTER JOIN t2
    <strong>ON sepgsql_tuple_perms(t1, ...)
    and sepgsql_tuple_perms(t2, ...)</strong>;

しかし、この場合左側テーブルである t1 に含まれるタプルの絞り込み条件が効かない。
そのため、実際には以下のようにサブクエリに書き換える必要がある。

SELECT * FROM t1 LEFT OUTER JOIN t2;
↓
SELECT * FROM
    <strong>(SELECT * FROM t1 WHERE sepgsql_tuple_perms(t1, ...)) AS t1</strong>
    LEFT OUTER JOIN t2 <strong>ON sepgsql_tuple_perms(t2, ...)</strong>

これによって、絞込み済みの左側テーブルと、ONによって絞り込まれる右側テーブル間のLEFT OUTER JOINという処理になる。

RIGHT OUTER JOINの場合は左右が逆、FULL OUTER JOINの場合はこれを両側に適用することとなる。

昨日の未踏ソフト中間報告会で、ウェラブルコンピューティングみたいな華のあるソフトに比べると、SELinuxは話が堅いよね〜と言われたが、硬くて結構。モノがモノなんだから。