ある程度複雑な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 (副問い合わせ)
という形式にして書くことで、副問い合わせに名前を付けて何度も呼び出せるようになりました。