如何从表1中选择在某些日期之间没有表2中记录的记录

时间:2012-10-09 17:34:27

标签: tsql

我有客户表和另一个与他们相关的销售活动(电话,电子邮件ecc)。 我需要知道的是,过去30天内哪些客户没有联系过(没有活动)。

这是我正在尝试做的事情:

SELECT crm_customers.id, crm_ customers.companyname
FROM crm_ customers 
LEFT JOIN crm_activities on crm_customers.id = crm_ activities. Customerid
WHERE crm_ activities.createddate < (getDate() – 30)

问题是,即使他们有最近的活动,它也会返回活动时间超过30天的客户。我需要在过去30天内只获得没有任何销售活动的客户 谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

这可能会对您有所帮助:使用子查询:

select 
    cust.id, cust.compayname
from
    crm_customers as cust
    left join (
        select 
            * 
        from 
            crm_activities 
        where 
            createddate >= (getDate() - 30)
    ) as act on cust.id = act.customerId
where
    act.customerId is null

这样您排除所有在过去30天内有活动的客户。


您可能希望通过执行以下操作来清理这一点:

select 
    cust.id, cust.compayname
from
    crm_customers as cust
    left join (
        select distinct 
            customerId 
        from 
            crm_activities where createddate >= (getDate() - 30)
    ) as act on cust.id = act.customerId
where
    act.customerId is null

这是相同的基本想法......唯一的问题是第二个选项只返回有活动的客户的ID。我认为这可能会优化外部where子句,但它可能会对子查询产生性能影响(没有免费午餐)

答案 1 :(得分:0)

SELECT crm_customers.id, crm_customers.companyname
FROM crm_customers 
LEFT JOIN crm_activities 
  on crm_customers.id = crm_activities.Customerid
 and DATEDIFF(DD, crm_activities.createddate, getdate()) < 30
where crm_activities.Customerid is null

这是一个条件,在连接中的条件不同于where

对于速度,我怀疑在子查询上加入。它为查询优化器提供了更多优化选项。不需要明确的。假设crm_activities.Customerid被索引,这是在索引上加入的。使用子查询,它将使用索引来创建列表,但子查询的输出不会被编入索引。

将取决于你的数据。我有一张大桌子要测试。

查询计划不同。

在一个循环加入它是死热 在哈希连接上快两倍 在合并连接上加快十倍

如果没有被排除在外,那将是一个死热 它会出现在哪里,如果有许多被排除在外(已在过去30年中联系过)。