You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:53:10