0

我有一个这样的简单查询:

SELECT subs.id_number, 
       op.dtupdated as dtopened
FROM subscribers AS subs
LEFT OUTER JOIN messages AS msg
ON msg.id_number = subs.id_number
LEFT JOIN email_opens AS op
ON op.message_id = msg.message_id
WHERE op.dtupdated  > dateadd(month,-3,CURRENT_TIMESTAMP)

基本上,我试图获取一个表中的所有记录,该表跟踪电子邮件何时打开(email_opens),该电子邮件通过 id_number 字段与订阅者相关联。我想获得过去 3 个月内打开的所有电子邮件以及相关的 id_number,但我也想至少包含一次,所有 id 号都包含在订阅者表中。

问题是我的 where 子句消除了过去 3 个月内从未有任何打开的电子邮件的所有记录,但我想包含一条带有 id_number 和“NULL”的记录作为 dtopened 用于没有任何打开的订阅者。

我尝试了左外连接,联合(它有效,但后来我有重复),我似乎无法找到如何做到这一点。我确信必须有一个简单的方法,而我只是还没有喝足够的咖啡。

4

1 回答 1

0

op.dtupdatedWHERE子句意味着过滤掉不匹配的记录。如果您在the 的ON子句中执行此操作LEFT OUTER JOIN,您将在 上的每条记录中至少获得一行subscribers

SELECT subs.id_number
    ,op.dtupdated AS dtopened
FROM subscribers AS subs
LEFT OUTER JOIN messages AS msg ON msg.id_number = subs.id_number
LEFT OUTER JOIN email_opens AS op ON op.message_id = msg.message_id
    AND op.dtupdated > dateadd(month, - 3, CURRENT_TIMESTAMP)
于 2013-04-26T23:53:03.443 回答