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

Sql 链接三个表并查找符合要求的数据,sql,postgresql,Sql,Postgresql,我有三个PostgreSQL表:地址、装运和时间表。 装运和计划都有地址的外键 地址表包含有关地址的信息:id、姓名、号码、街道、州、邮政编码 发货表有:id、跟踪号、发货日期、地址 时间表有:id、星期日、星期一、星期二、星期三、星期四、星期五、星期六、类型、地址\u id 计划表中的所有日期都是布尔值,例如:id=2,sunday=false,周一=true,周二=true,周三=true,thrusday=false,周五=false,周六=false,type='reporting',a

我有三个PostgreSQL表:地址、装运和时间表。 装运和计划都有地址的外键

地址表包含有关地址的信息:id、姓名、号码、街道、州、邮政编码 发货表有:id、跟踪号、发货日期、地址 时间表有:id、星期日、星期一、星期二、星期三、星期四、星期五、星期六、类型、地址\u id

计划表中的所有日期都是布尔值,例如:id=2,sunday=false,周一=true,周二=true,周三=true,thrusday=false,周五=false,周六=false,type='reporting',address_id=1

我想做的是,将三个表链接在一起,找到昨天没有发货的地址,它应该基于带有“reporting”类型的时间表。例如,我们有3个地址,芝加哥,洛杉矶,纽约,今天是星期二,芝加哥发出了两批货,发货日期存储在发货日期中,所以它会有昨天的日期,我们可以从这个日期找到昨天是哪一天,但洛杉矶和纽约没有发出任何信息,芝加哥和洛杉矶周一的报道日程都是如此,但纽约市没有。我应该从我的结果中得到的是洛杉矶,因为它没有在周一发货,但应该根据时间表发货。我将在前一天每天运行此报告

我试过几种不同的方法,但都没有成功。任何帮助都将不胜感激

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。。。 如果当前时间的一周中的某一天是星期一,我们将查看星期日日程安排 <> P>如果想简化查询,可以考虑另一种结构。例如:id、星期几、类型、地址id


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

时间戳的下限应包含在内,因为午夜可能有效,但上限排除今天之前的所有内容。风格要点:通常最好只保留WHERE子句作为与FROM子句引用进行比较的条件,并将引用其他联接的所有其他条件作为ON子句的一部分;这使他们操作的对象保持局部条件。