【问题标题】:SQL find out joined table has no record in recent 30 daysSQL查找连接表最近30天没有记录
【发布时间】: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 可能会起作用

标签: sql sql-server datetime


【解决方案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 区分所有这些值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2016-08-20
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多