从查询中获取空结果

时间:2021-07-27 12:29:52

标签: sql sql-server

我有客户表

  • ClientGuid 电子邮件电话

还有活动表

  • ActivityTitle 日期 ClientGuid

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

我想收到过去三个月没有任何活动但之前有活动的客户的电子邮件。

试过了:

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())

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

1 个答案:

答案 0 :(得分:2)

我不明白您为什么要在子查询中使用 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 并过滤掉客户端。