以下のクエリを作成しました。
select * from store str
left join(
select * from schedule sdl
where day = 3
order by
case when sdl.store_id is null then (
case when sdl.strong is true then 0 else 2 end
) else 1 end, sdl.schedule_id desc
) ovr on (ovr.store_id = str.store_id OR ovr.store_id IS NULL)
サンプルデータ:
STORE
[store_id] [title]
20010 Shoes-Shop
20330 Candy-Shop
[SCHEDULE]
[schedule_id] [store_id] [day] [strong] [some_other_data]
1 20330 3 f 10% Discount
2 NULL 3 t 0% Discount
から取得したいのLEFT JOIN
は、NULL store_id (グローバル スケジュール エントリ - すべてのストア エントリに影響する) のデータ、または指定された store_id の実際のデータです。
このようにクエリを結合すると、正しい順序で結果が返されますが、NULL と store_id の両方が一致します。join 句で OR ステートメントを使用することは理にかなっています。
予想された結果:
[store_id] [title] [some_other_data]
20010 Shoes-Shop 0% Discount
20330 Candy-Shop 0% Discount
現在の結果:
[store_id] [title] [some_other_data]
20010 Shoes-Shop 0% Discount
20330 Candy-Shop 0% Discount
20330 Candy-Shop 10% Discount
この件についてもっとエレガントなアプローチがあれば、喜んでそれに従います。