使用一个查询来查找所有的细节记录,如果一个被更新?



我使用的是SQL Server 2017。有两个表:主表和明细表。如果Details表中的一条记录今天更新了,那么应该找到与主表中与更新的Details记录相关联的所有Details表中的记录,以及来自主表的一些信息。下面是一个示例:

主表

id     name
----------------
1      master1
2      master2

详细信息表

id  master_id   info       update_date
-----------------------------------
1   1           details1   2021-09-07
2   1           details2   2021-09-01
3   2           details2   2021-09-03

假设今天是2021-09-07。那么所需的查询应该返回

1          1        master1    details1   2021-09-07
1          2        master1    details2   2021-09-01

前两列是Master和Details记录的id。

我能够使用查询来查找今天通过update_date字段上的条件的简单连接更新的Details记录。我无法使用SINGLE查询以查找与更新的Details记录与同一主记录相关联的其他Details记录(如果有的话)。

有可能今天更新了与同一主记录关联的两个或多个Details记录,那么结果不应该包含重复条目。例如,如果#2 Details记录今天更新,如下所示:

id  master_id   info       update_date
-----------------------------------
1   1           details1   2021-09-07
2   1           details2   2021-09-07
3   2           details2   2021-09-03

那么结果应该是:

1       1      master1    details1   2021-09-07
1       2      master1    details2   2021-09-07

如何使用单个查询返回所需的结果?

让我们从子查询开始查找所需的master_id值。

SELECT DISTINCT master_id
FROM details
WHERE update_date = <<the desired date>>

然后我们可以在查询中使用它来获得结果集。

SELECT details.id, details.master_id, 
master.name, details.info, details.update_date
FROM master
JOIN details ON master.id = details.master_id
WHERE master.id IN (
SELECT DISTINCT master_id
FROM details
WHERE update_date = <<the desired date>>
)

SQL是关于记录集的。因此,子查询获取所需日期的master_id值集合,然后使用该集合获取所需的详细记录。

也许你正在寻找的查询是

select 
D.master_id, D.id, M.name, D.info, D.update_date         
from Details D
inner join Master M 
on M.id =D.master_id
and D.master_id in 
(
select 
distinct master_id   
from Details
where 
update_date = CAST(GETDATE() as DATE)
)
SELECT MT.* FROM masterTable MT WHERE EXISTS (SELECT TOP(1) 1 FROM detailsTable DT WHERE MT.id = DT.master_id AND update_date = CONVERT(DATE,GETDATE()));

相关内容

  • 没有找到相关文章

最新更新