我使用的是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()));