链接三个表并查找符合要求的数据

时间:2017-10-13 16:05:58

标签: sql postgresql

我有三个PostgreSQL表:地址,发货和时间表。 货件和时间表都有地址的外键。

地址表包含有关地址的信息:id,name,number,street,state,zip 货件表有:id,跟踪号,date_ship_on,address_id 时间表有:id,sunday,monday,tuesday,Wednesday,thrusday,friday,Saturday,type,address_id

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

我正在尝试做的是,将三个表连接在一起,找到昨天没有发货的地址,它应该基于类型“报告”的时间表。因此,例如,我们有3个地址,芝加哥,洛杉矶,纽约,今天是星期二,芝加哥昨天发出两个货物(发货日期存储在date_shipped_on,所以它将有昨天的日期,我们可以找到昨天是从哪一天但是洛杉矶和纽约市并没有发出任何消息,芝加哥和洛杉矶在周一的报告时间表都是如此,但纽约市没有。我应该得到的是洛杉矶的结果,因为它没有星期一发出的货物,但应该根据时间表。我将在前一天每天运行此报告。

我尝试了一些不同的东西,但没有运气。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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&#39;昨天&#39;是昨天午夜。
  • dow = 0表示星期日,1表示星期一,...
  • 如果当前时间的星期几是星期一,我们看周日日程

如果要简化此查询,可以考虑调度表的另一种结构。例如:id,day_of_week(int),type,address_id。

编辑:根据Clockwork-Muse的评论在时间戳上添加了包含下限。