0

以下のクエリを作成しました。

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

この件についてもっとエレガントなアプローチがあれば、喜んでそれに従います。

4

2 に答える 2