SQLの副問い合わせをまとめる。

ある程度複雑なSQLを書いていると、副問い合わせが複数出てくることもあるかと思います。

SELECT 
(SELECT COUNT
    (t0.owner_id) FROM 
        (SELECT t1.owner_id FROM eip_t_timeline_like t1 WHERE 
        t1.timeline_id = timeline_id) AS t0 
    WHERE (t0.owner_id = 25)
) AS is_like, 
(SELECT COUNT
    (t0.owner_id) FROM
        (SELECT t1.owner_id FROM eip_t_timeline_like t1 WHERE 
        t1.timeline_id = timeline_id) AS t0
)AS l_count 
FROM 
eip_t_timeline t 
WHERE  ...

複数の副問い合わせのなかに同じものが出てきた時、ただでさえ長くなりがちなSQLを2回も書くのは面倒だし可読性が悪くなってしまいます。上の例は簡略化したものなのであまり意味のあるSQL文ではありませんが、同じSELECT文が2回登場しています。

これをWITHによる共通表式をつかって簡略化すると、次のようになります。

WITH t0 AS
(SELECT t1.owner_id FROM eip_t_timeline_like t1 WHERE 
        t1.timeline_id = timeline_id)
SELECT
(SELECT COUNT
 (t0.owner_id) FROM t0 
 WHERE (t0.owner_id = 25)
) AS is_like, 
(SELECT COUNT
 (t0.owner_id) FROM t0
)AS l_count 
FROM 
eip_t_timeline t 
WHERE ...

WITH 名前 AS (副問い合わせ)

という形式にして書くことで、副問い合わせに名前を付けて何度も呼び出せるようになりました。