SQL查找联接表在最近30天内没有记录

SQL查找联接表在最近30天内没有记录,sql,sql-server,datetime,Sql,Sql Server,Datetime,我想查询最近30天在SQL Server中没有任何新产品的活动商店 下面是这些表的模式 表Store int | id | string | status | 表产品 int | id | string | name | datetime | created_at | int | store_id | 起初,我写了这样的东西 select s.* from Store as s join Product p on s.i

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

下面是这些表的模式

Store

int    | id       | 
string | status   | 
产品

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())
选择s*
从商店购买
在s.id=p.store\U id上加入产品p
其中s.status=‘活动’
和p.created_在

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

如果我理解正确,您可以使用
不存在
这样:

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

因此,您需要找到每个商店的最大创建值,然后根据目标日期进行测试。不同的方法可以做到这一点——确保你的样本测试数据中没有产品。@SMor-yup,may-workHm创建的max,我明白了,另一种思考方式。
SELECT 1
是什么意思?出于
不存在的目的,它只是一个占位符。您也可以使用
SELECT*
,效果也一样。是的,这个也可以,谢谢。它们之间有什么区别吗?基本上就是你的思维方式。在第一个答案中,您正在验证存储在产品中的每个id。第二个答案返回所选范围内产品的所有store_id,然后store会区分所有这些值。