2017-10-13 4 views
0

私は3つのPostgreSQLのテーブルを持っています:住所、郵送物、およびスケジュール。 出荷とスケジュールにはどちらも住所用の外部キーがあります。3つのテーブルをリンクし、要件に一致するデータを見つける

アドレステーブルは、アドレスに関する情報があります。idは、名前、番号、通り、状態、 ファスナーを出荷テーブル有する:ID、追跡番号、date_ship_onは、 address_idをスケジュールテーブル有する:ID、日曜日、月曜日、

例:id:2、sunday = false、monday = true、tuesday = true、wednesday = true、thrusdayの各日は、 = false、friday = false、saturday = false、type = 'reporting'、address_id = 1

私がしようとしているのは、3つのテーブルをリンクして、船員を持たない住所を見つけることです昨日送信され、それはタイプ '報告'のスケジュールに基づいているはずだった。たとえば、シカゴ、LA、NYCの3つの住所があります。今日は火曜日です。シカゴは昨日2つの出荷を出しました(出荷日はdate_shipped_onに保存されているため、昨日の日付があり、昨日はこれからでしたLAとNYCは何も送っていないが、シカゴとLAはともに月曜日には報道スケジュールに当てはまるがNYCはそうではなかった。私が戻ってくるべきことは、月曜日に発送された郵便物を持っていなかったので、私の結果からLAだったが、予定に基づいていた。前日にこのレポートを毎日実行します。

私は少し違ったことを試みましたが、運が悪いです。どんな助けでも大歓迎です。

答えて

1
SELECT a.* 
FROM address a INNER JOIN schedule s ON a.id = s.address_id 

-- no shipment sent out yesterday 
WHERE NOT EXISTS (SELECT * FROM shipment sh 
    WHERE sh.address_id = a.id 
    AND date_ship_on >= TIMESTAMP 'yesterday' 
    AND date_ship_on < TIMESTAMP 'today') 

-- was supposed to based on the schedule with the type 'reporting' 
AND s.type = 'reporting' 
AND (
     (s.sunday = true  AND extract(dow from current_timestamp) = 1) 
    OR (s.monday = true  AND extract(dow from current_timestamp) = 2) 
    OR (s.tuesday = true AND extract(dow from current_timestamp) = 3) 
    OR (s.wednesday = true AND extract(dow from current_timestamp) = 4) 
    OR (s.thursday = true AND extract(dow from current_timestamp) = 5) 
    OR (s.friday = true  AND extract(dow from current_timestamp) = 6) 
    OR (s.saturday = true AND extract(dow from current_timestamp) = 0) 
); 

いくつかの説明:

  • TIMESTAMP '昨日' は月曜日のための日曜日、1のために深夜
  • ダウ= 0で昨日で、...
  • ば我々は日曜日のスケジュールを見て現在の時刻の曜日が月曜日

スケジュール表の別の構造を検討することができます。このクエリを簡素化します。たとえば、id、day_of_week(int)、type、address_idなどです。

EDIT:Clockwork-Museのコメントに基づいてタイムスタンプに包括的な下限を追加しました。

+1

タイムスタンプの下限は(真夜中が有効かもしれないので)包括的であるべきですが、上限は排他的です( "today"の前のすべて)。 point of style:通常、 'WHERE'節を' FROM'節参照と比較する条件だけに予約し、 'ON'節の一部として他の結合を参照する他のすべての条件を置きます。これは彼らが操作するもののローカルな状態を保つ。 –

関連する問題