首页 > 解决方案 > 从查询中获取空结果

问题描述

我有客户表

还有活动表

如果客户端做了一些“活动”,它会保存在活动表中。

我想获取最近三个月没有任何活动并且之前有活动的客户的电子邮件。

试过这个:

select Email
from Client
where NOT EXISTS (
SELECT Email
FROM Client c
LEFT JOIN Activity a on a.ClientGuid = a.ClientGuid
WHERE a.Date > DATEADD(MONTH, -3, GETDATE())

得到空的结果。我错过了什么?

标签: sqlsql-server

解决方案


我不明白您为什么要join在子查询中使用 - 更不用说外部连接了。这将返回过去三个月内没有活动的客户的电子邮件:

select c.Email
from Client c
where not exists (select 1
                  from Activity a 
                  where a.ClientGuid = a.ClientGuid and
                        a.Date > DATEADD(MONTH, -3, GETDATE())
                 );

但是,这也会返回根本没有任何活动的客户。所以,你似乎想要:

select c.Email
from Client c
where (select max(a.date)
       from Activity a 
       where a.ClientGuid = a.ClientGuid
      ) <= DATEADD(MONTH, -3, GETDATE());

如果没有活动,则返回子查询NULL并过滤掉客户端。


推荐阅读