以前やったことを忘れがちなので、改めてここにまとめておく。
SELECT * FROM ( VALUES (1::integer), (2), (3), (5), (7), (11) ) AS tbl(tbl_cd)
これは何をやっているのかというと、本来はテーブルから読みだして連結させるべきところを、SELECT文中で固定値でテーブルから読みだしたように扱う方法。
SELECT * FROM ( VALUES (1::integer, 'お店A'::text), (2, 'お店B'), (3, 'お店C'), (5, 'お店D'), (7, 'お店E'), (11, 'お店F') ) AS shop_tbl(shop_cd, shop_name)
これに対してLEFT JOINを使うとすごく便利に感じた。
例えば、特定店舗の売上データを集計するとする。 あるテーブルにshop_cdをキーにした売上データが入っていて、shop_tblはデータベース格納していなくて、特定のshop_cdに対して売上データを読み取りたい場合。
SELECT s.shop_cd, s.shop_name, coalesce(a.sales_amount, 0) AS sales_amount SELECT * FROM ( VALUES (1::integer, 'お店A'::text), (2, 'お店B'), (3, 'お店C'), (5, 'お店D'), (7, 'お店E'), (11, 'お店F') ) AS shop_tbl(shop_cd, shop_name) ) AS s LEFT JOIN ( SELECT shop_cd, sales_amount FROM sales_amounts WHERE ... ) AS a ON s.shop_cd = a.shop_cd
みたいに記述すれば、売上データがない店舗でも結果としてゼロを取得できるので、例えばphpからクエリー実行した場合にphp側で売上データがない場合の例外処理を記述しなくても済むようになる。
(予め、売上のない日でも売上ゼロを記録しておく、というのも一つの解決方法ではありますが。)