简单的左连接在同一个表上

时间:2016-07-07 08:24:44

标签: sql postgresql

我在构建一个可以完成相对简单的事情的查询时遇到了问题。

我有一个表,我们可以调用data。此表有一个date列和一个列,用于指定条目为daily数据或monthly数据。

我想要检索所有daily条记录以及当月没有每日记录的monthly条记录。示例:如果每日记录2016-01-10存在,那么我不想在2016-01-01上检索每月记录

我觉得以下查询应该是为了实现这个目标,但我无法弄清楚为什么它会返回太多行(重复)并且在重复数据删除时没有返回所需的集合。

SELECT daily.* 
FROM data daily 
LEFT JOIN data monthly 
    ON date_trunc('month', daily.date) != date_trunc('month', monthly.date) 
AND monthly.interval='monthly' 
WHERE daily.interval='daily' 
    AND monthly.interval='monthly'

预期的行为是返回左侧的所有记录,每日数据,并在没有返回与每日记录具有相同月份的月度记录的条件下加入。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下查询并告诉我这是否适合您

SELECT monthly.* 
FROM data monthly 
 where monthly.interval='monthly' and to_char(monthly.date, 'YYYY-MM') not in 
(select to_char(daily.date, 'YYYY-MM') from data daily where daily.interval='daily' ) 
UNION
SELECT daily.* 
FROM data daily 
 where daily.interval='daily'

答案 1 :(得分:1)

select *
from data d
where
    interval = 'daily'
    or
    interval = 'monthly'
    and
    not exists (
        select 1 from data
        where
            date_trunc('month', d.date) = date_trunc('month', date)
            and interval = 'daily'
    )