左连接产生内连接结果 - PostgreSQL
Posted
技术标签:
【中文标题】左连接产生内连接结果 - PostgreSQL【英文标题】:Left Join Yielding Inner Join Results - PostgreSQL 【发布时间】:2013-04-12 06:08:44 【问题描述】:我希望从零星发生的事件日志中获取值,并在事件之间的所有日期扩展这些值。例如:
一个完整的系列可能看起来像......
2013-01-01
2013-01-02
2013-01-03
2013-01-04
2013-01-05
但事件日志看起来像......
2013-01-01 | value_1
2013-01-04 | value_2
想要的最终结果如下...
2013-01-01 | value 1
2013-01-02 | value 1
2013-01-03 | value 1
2013-01-04 | value 2
2013-01-05 | value 2
作为解决方案,我正在尝试生成完整系列的日期,将选择性事件日志日期加入到该完整系列中,然后用所需的值填充 NULL 值,但我遇到了一个问题我的左连接产生内连接结果。
select
days.date,
e.value
from
--Generate table for dates
(select
row_number() over (),
generate_series::date as date
from
generate_series('2009-01-01',current_date + interval '100 days',interval '1 day')) days
--Combine actual change log
left join
(select
value,
event_date
from event_table
where type = 'desired_type') e
on days.date = e.event_date
我的结果集不是包含完整日期的 1669 行,而是只有几个 e.value,而是每个非 NULL days.date、e.value 组合只有一行。视觉上,而不是...
2009-01-01 | value 1
2009-01-02 | NULL
2009-01-03 | NULL
2009-01-04 | value 2
2009-01-05 | NULL
...
...我得到...
2009-01-01 | value 1
2009-01-04 | value 2
...
我希望这是一个内部连接,而不是从几天到 e 的左连接。
【问题讨论】:
这就是您的全部查询吗?你没有where
子句吗?
【参考方案1】:
LEFT JOIN
应该可以正常工作。
您可以在很大程度上简化整个查询:
SELECT d.day, e.value
FROM (
SELECT rn, '2009-01-01'::date + rn AS day
FROM generate_series(0, (now()::date - '2009-01-01'::date) + 100) AS g(rn)
) d
LEFT JOIN event_table e ON e.event_date = d.day AND e.type = 'desired_type'
然而,就在几天前,有人问了一个非常相似的问题。它有许多非常好的答案(包括我可能添加的我的答案)。您会在此处找到完整的解决方案:How do I write a join with this unusual matching criteria?
【讨论】:
我可能会使用另一个线程中提出的 Lead() 方法,但我仍然对“左连接应该正常工作”的原因感到困惑。 @Nick 因为您发布的查询应该给出预期的结果。当然,您隐藏了一个where
子句,将其转换为 inner join
。
我想要的最终查询将在 where 子句中包含内容(我只想为特定帐户提供结果),但是,我还没有构建这些内容,只是对生成的结果进行评估系列和事件日志表。
@Nick:如果你的LEFT JOIN
仍然失败,你需要提供一个完整的测试用例来重现效果。理论上这是不可能的。它必须是你的问题中没有的东西。很有可能,您会在尝试构建测试用例时发现它(并且不可避免地会失败)。以上是关于左连接产生内连接结果 - PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章