SQL Server中如何更简洁获取修改产品及其父子产品数据集?
问题
在SQL Server数据库中有标准产品表和父子关系表,需要获取一批已修改产品及其父产品、子产品的单一数据集,用于执行维护操作。目前通过3个查询加UNION实现,但希望找到更简洁的写法,尤其是当WHERE条件变复杂时,避免重复编写相同条件。
表结构
产品表(products)
pid mod_date ---------------------- 1 01-01-2023 2 20-01-2023 3 09-06-2023 4 01-01-2023 5 20-05-2023 6 09-06-2023 7 01-01-2023
父子关系表(parent_child)
parent_pid child_pid ---------------------- 1 2 3 4 5 6 5 7
当前使用的SQL语句
SELECT pid FROM products WHERE mod_date > dateAdd(day, -1, getdate()) UNION SELECT pc1.child_pid FROM products p INNER JOIN parent_child pc1 ON pc1.parent_pid = p.pid WHERE p.mod_date > dateAdd(day, -1, getdate()) UNION SELECT pc2.parent_pid FROM products p INNER JOIN parent_child pc2 ON pc2.child_pid = p.pid WHERE p.mod_date > dateAdd(day, -1, getdate())
注:假设
GETDATE()返回2023-06-09,查询结果为:3 4 5 6
是否存在更简洁的方式得到相同结果?
解决方案
用**公共表表达式(CTE)**先提取所有已修改的产品,再基于这个CTE关联父子关系表,就能一次性获取目标数据集。这种写法把重复的WHERE条件只写一次,代码更简洁,后续维护也更方便:
WITH ModifiedProducts AS ( SELECT pid FROM products WHERE mod_date > DATEADD(day, -1, GETDATE()) ) SELECT mp.pid AS target_pid FROM ModifiedProducts mp UNION SELECT pc.child_pid FROM ModifiedProducts mp JOIN parent_child pc ON mp.pid = pc.parent_pid UNION SELECT pc.parent_pid FROM ModifiedProducts mp JOIN parent_child pc ON mp.pid = pc.child_pid;
核心优势:
- 避免重复编写相同的筛选逻辑,复杂条件只需维护CTE部分
- 结构清晰,可读性远高于重复写三次WHERE的原语句
- 保留原SQL的去重逻辑(
UNION自动去重),如果确认无重复数据,换成UNION ALL能提升性能
内容的提问来源于stack exchange,提问作者Code Ninja
相关产品推荐
相关产品推荐

