以前やったことを忘れがちなので、改めてここにまとめておく。
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側で売上データがない場合の例外処理を記述しなくても済むようになる。
(予め、売上のない日でも売上ゼロを記録しておく、というのも一つの解決方法ではありますが。)