2017-10-13 79 views
0

我有三個PostgreSQL表:地址,出貨量和計劃。 貨件和時間表都有地址的外鍵。鏈接三個表並查找與要求匹配的數據

地址表中有關於地址的信息:ID,姓名,號碼,街道,州,郵編 裝運表有:ID,跟蹤號碼,date_ship_on,ADDRESS_ID 日程安排表有:ID,週日,週一,星期二,星期三,星期五,星期五,星期六,類型,地址_id

日程表中的所有日子都是布爾值ex:id = 2,sunday = false,monday = true,tuesday = true,wednesday = true,thrusday = false,friday = false,saturday = false,type ='reporting',address_id = 1

我想要做的是,將三個表連接起來,找到沒有船員的地址t昨天發出,它應該基於時間表類型「報告」。舉例來說,我們有3個地址,芝加哥,洛杉磯,紐約,今天是星期二,芝加哥昨天發出了兩批貨物(發貨日期存儲在date_shipped_on中,所以它會有昨天的日期,我們可以找到昨天的哪一天是從這個日期),但洛杉磯和紐約沒有發送任何東西,芝加哥和洛杉磯在週一的報道日程表上都是正確的,但紐約市則沒有。我應該從我的結果中得到回報,因爲它沒有星期一發送的貨物,但應該根據時間表。我會在前一天每天運行這個報告。

我試過幾個不同的東西,但沒有運氣。任何幫助將不勝感激。

回答

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) 
); 

幾點說明:

  • 時間戳「昨天是昨天半夜
  • 道瓊斯指數= 0代表星期日,1代表星期一,...
  • 我們看看週日的日程安排,如果當前時間的星期幾是星期一

如果您想要爲您的日程安排表考慮其他結構簡化這個查詢。例如:id,day_of_week(int),type,address_id。

編輯:基於Clockwork-Muse的評論添加了包含時間戳的下限。

+1

時間戳的下限應該是包容性的(因爲午夜可能是有效的),但上限是排他性的(「今天」之前的所有內容)。風格點:通常最好只爲與'FROM'子句引用進行比較的條件保留'WHERE'子句,並將所有其他引用其他連接的條件作爲其ON子句的一部分;這保持了它們所在的地方的條件。 –

相關問題