如何为同一表的不同列绑定不同WHERE子句以合并SQL查询?
合并查询实现同一行展示不同stepid的Value
问题背景
当Process ID = 610时,stepid与Value的对应关系如下:
| stepid | Value |
|---|---|
| 50 | 2 |
| 60 | 16 |
| // | 2 |
| 80 | 128 |
原本通过两个独立查询从同一张表分别获取value1(对应stepid=50)和value2(对应stepid=80),现在想合并为单查询,避免重复访问表。当前查询仅筛选了stepid=50的记录,value2未关联stepid=80的条件,需要调整语句实现同一行展示两个stepid的值。
解决方案
推荐两种实现方式,根据你的数据场景选择:
方式一:条件聚合(单表扫描,性能更优)
通过CASE WHEN搭配聚合函数,在一次表扫描中提取不同stepid的值:
select [serialno], MAX([storedatetime]) as [storedatetime], -- 取该serialno下最新的时间,可根据需求调整 MAX(CASE WHEN [stepid] = 50 THEN [value] END) as [value1], MAX(CASE WHEN [stepid] = 80 THEN [value] END) as [value2], ROW_NUMBER() OVER (PARTITION BY [serialno] ORDER BY MAX([storedatetime]) desc) AS RowNumber from [database] where [processid] = 610 and [stepid] in (50, 80) -- 只过滤需要的stepid,减少数据处理量 group by [serialno]
- 逻辑:按
serialno分组,用CASE WHEN分别匹配stepid=50和80的Value,聚合函数MAX确保每个分组内取到对应stepid的有效值(若一个serialno对应多个同stepid记录,可根据需求换成MIN或LAST_VALUE等)。
方式二:自连接
通过表自连接关联同一serialno下不同stepid的记录:
select a.[serialno], a.[storedatetime], a.[value] as [value1], b.[value] as [value2], ROW_NUMBER() OVER (PARTITION BY a.[serialno] ORDER BY a.[storedatetime] desc) AS RowNumber from [database] a left join [database] b on a.[serialno] = b.[serialno] and b.[processid] = 610 and b.[stepid] = 80 where a.[processid] = 610 and a.[stepid] = 50
- 逻辑:将表拆分为两个逻辑表,
a表取stepid=50的记录,b表关联同一serialno下stepid=80的记录,LEFT JOIN确保即使没有stepid=80的记录,也能保留stepid=50的数据(此时value2为NULL)。
注意事项
- 若一个
serialno对应多个同stepid的记录,条件聚合更适合做数据聚合(如取最新值);自连接可能产生重复行,需额外添加过滤条件。 - 根据实际表结构和数据量选择方案,条件聚合通常性能更优,因为仅需扫描一次表。
内容的提问来源于stack exchange,提问作者Josh M
相关产品推荐
相关产品推荐

