SQL查询异常:需合并为单行并固定指定PRODUCT_ID
解决方案:合并UNION结果并固定PRODUCT_ID
问题根源
原SQL通过UNION合并了两组不同PRODUCT_ID的聚合结果,导致返回两行数据;需求要求取所有符合条件记录的最大结算日期,且PRODUCT_ID固定为硬编码值324770793,与关联表中的PRODUCT_ID无关。
优化后的SQL(方案一:直接整合筛选条件)
SELECT MAX(SETTLEMENT_DATE) AS MAX_SETTLEMENT_DATE, 324770793 AS PRODUCT_ID, book_id FROM trade t WHERE book_id = 212344790 AND ( -- 直接匹配目标PRODUCT_ID product_id = 324770793 -- 匹配关联表中符合条件的PRODUCT_ID OR product_id IN ( SELECT product_id FROM PRODUCT_CA WHERE UNDERLYING_ID = 324770793 AND CA_TYPE IN ('REDEMPTION', 'AMORTIZATION', 'PAYDOWN', 'EXERCISE', 'EXPIRY', 'MERGER') ) ) GROUP BY book_id;
逻辑说明
- 将两个筛选条件合并到
WHERE子句,一次性获取所有符合要求的trade记录 - 直接硬编码
PRODUCT_ID为指定值,无需依赖分组字段 - 通过
MAX(SETTLEMENT_DATE)获取所有符合条件记录的最大结算日期,GROUP BY book_id确保返回单行结果
优化后的SQL(方案二:处理UNION结果)
如果需要保留原查询的拆分逻辑,可通过嵌套查询合并结果:
SELECT MAX(MAX_SETTLEMENT_DATE) AS MAX_SETTLEMENT_DATE, 324770793 AS PRODUCT_ID, book_id FROM ( -- 第一部分:目标PRODUCT_ID的最大日期 SELECT MAX(SETTLEMENT_DATE) AS MAX_SETTLEMENT_DATE, book_id FROM trade t WHERE product_id = 324770793 AND book_id = 212344790 GROUP BY book_id UNION ALL -- 第二部分:关联表匹配的PRODUCT_ID的最大日期 SELECT MAX(SETTLEMENT_DATE) AS MAX_SETTLEMENT_DATE, book_id FROM trade t WHERE product_id IN ( SELECT product_id FROM PRODUCT_CA WHERE UNDERLYING_ID = 324770793 AND CA_TYPE IN ('REDEMPTION', 'AMORTIZATION', 'PAYDOWN', 'EXERCISE', 'EXPIRY', 'MERGER') ) AND book_id = 212344790 GROUP BY book_id ) AS combined_results GROUP BY book_id;
逻辑说明
- 用
UNION ALL合并两个子查询的最大日期结果(比UNION更高效,无需去重) - 外层查询取所有日期的最大值,硬编码
PRODUCT_ID,最终返回单行结果
内容的提问来源于stack exchange,提问作者pablo_dev
相关产品推荐
相关产品推荐

