Postgres 不同联合仅适用于特定列

ere*_*ere 5 postgresql union postgresql-9.4

我有两组数据,其中一组是动态生成的。

如果我离开该列,state它会完美地工作,因为该列并不真正存在,我的问题是如何忽略 UNION 的列,以便它组合两个数据集(因为它与 UNION ALL 相同)。例如,我更喜欢第一个表,并且希望忽略第二个数据集中的任何行(如果它们存在于第一个表中)。

SELECT event_id, start_at, state
FROM event_logs
WHERE start_at BETWEEN current_date AND current_date + interval '3 weeks'
UNION
SELECT id event_id,
GENERATE_SERIES(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int - 1) + start_at::time, current_date + interval '3 weeks', '1 week'::INTERVAL) AS start_at,
'draft' AS state
FROM events
Run Code Online (Sandbox Code Playgroud)

更新,也尝试过:

WITH future_logs AS (
 SELECT id event_id,
 GENERATE_SERIES(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int -  1) + start_at::time, current_date + interval '3 weeks', '1 week'::INTERVAL) AS start_at,
 'draft' AS state
 FROM events)

SELECT future_logs.event_id, future_logs.start_at, future_logs.state
FROM future_logs
LEFT JOIN event_logs ON future_logs.event_id = event_logs.event_id AND future_logs.start_at = event_logs.start_at
WHERE event_logs.start_at BETWEEN current_date AND current_date + interval '3 weeks'
Run Code Online (Sandbox Code Playgroud)

但得到的结果太少了 77 与预期的 1000 相比。

wil*_*ser 4

只需添加NOT EXISTS()到第二条腿,您就可以使用它UNION ALL来避免排序/合并。


SELECT event_id, start_at, state
FROM event_logs
WHERE start_at BETWEEN current_date AND current_date + interval '3 weeks'

UNION ALL

SELECT id AS event_id
        , generate_series(date_trunc('week', current_date)::date + (extract(isodow from start_at)::int - 1) + start_at::time
                , current_date + interval '3 weeks'
                , '1 week'::INTERVAL) AS start_at
        , 'draft' AS state
FROM events ev
WHERE NOT EXISTS ( SELECT*
        FROM event_logs nx
        WHERE nx.event_id =ev.id
        AND nx.start_at BETWEEN current_date AND current_date + interval '3 weeks'      )

        ;
Run Code Online (Sandbox Code Playgroud)