SQL查找连接表最近30天没有记录

Posted

技术标签:

【中文标题】SQL查找连接表最近30天没有记录【英文标题】:SQL find out joined table has no record in recent 30 days 【发布时间】:2021-02-25 18:02:51 【问题描述】:

我想查询SQL Server最近30天内没有任何新产品的活跃商店

这是表的架构

Store

int    | id       | 
string | status   | 

Product

int      | id       | 
string   | name     |
datetime | created_at |
int      | store_id |

一开始我是这样写的

select s.*
from Store as s
join Product p on s.id = p.store_id
where s.status = 'active'
and p.created_at < DATEADD(day, -30, GETDATE())

显然,这是不对的,只要有 30 天之前创建的产品,就会查询所有商店。

【问题讨论】:

因此您需要找到每个商店的最大 created_at 值,然后针对目标日期进行测试。不同的方法来做到这一点 - 并确保您的商店在您的样本测试数据中没有产品。 @SM或者是的,max created_at 可能会起作用 【参考方案1】:

如果我理解正确,您可以像这样使用NOT EXISTS

SELECT *
FROM Store s
WHERE s.Status = 'Active'
AND NOT EXISTS(
               SELECT 1
               FROM Product p
               WHERE p.Store_Id = s.Id
               AND p.Created_At >= DATEADD(day, -30, GETDATE())
                )

【讨论】:

嗯,我明白了,另一种思考方式。 SELECT 1 是什么意思? 对于NOT EXISTS,它只是一个占位符。你也可以使用SELECT *,它的工作原理是一样的。【参考方案2】:

我想这就是你要找的东西

select  *
from    Store
where   status = 'active'
and id NOT IN (select store_id
from    Product where created_at >= DATEADD(day, -30, GETDATE()))

【讨论】:

是的,这个也可以,谢谢。它们之间有什么区别吗? 基本上就是你的思维方式。在第一个答案中,您正在验证产品中商店的每个 id。第二个答案返回所选范围内产品的所有 store_id,然后 store 区分所有这些值。

以上是关于SQL查找连接表最近30天没有记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL 连接表和查找最大值

在连接表 B 中查找表 A 中没有记录的行

Oracle 表三种连接方式(sql优化)

SQL 查询 - 返回连接表的前两条记录的连接

实体框架将纯连接查找表转换为多对多关系

连接sql表以选择连接表中不存在的记录[重复]