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天没有记录的主要内容,如果未能解决你的问题,请参考以下文章