将含子查询的SQL语句转换为使用CASE与JOIN的实现方案
转换后的SQL语句
SELECT cv.id, cv.Ticket_id, cv.serial_no, cv.operator, MAX(CASE WHEN fd.key = 'COMPUTER_TYPE' THEN fd.value END) AS COMPUTER_TYPE, MAX(CASE WHEN fd.key = 'BRAND' THEN fd.value END) AS BRAND, MAX(CASE WHEN fd.key = 'MODEL' THEN fd.value END) AS MODEL, cv.status, cv.datetime FROM Form cv LEFT JOIN Forms_Details fd ON cv.id = fd.FORM_ID AND fd.status = 'ACTIVE' WHERE cv.status = 'ACTIVE' GROUP BY cv.id, cv.Ticket_id, cv.serial_no, cv.operator, cv.status, cv.datetime ORDER BY cv.id DESC;
转换说明
- 用
LEFT JOIN关联Forms_Details表,将主表Form的id与明细表里的FORM_ID匹配,同时在关联条件里过滤掉明细表里状态非ACTIVE的记录,避免漏掉无对应明细的主表数据。 - 通过
CASE语句匹配明细的key值,把对应的value分别映射到COMPUTER_TYPE、BRAND、MODEL字段。使用MAX聚合函数是为了将同一主表记录的多条明细合并成一行,确保每个字段取到有效值(若同一key有多条记录,可根据需求替换成MIN等其他聚合函数)。 - 按主表的非聚合字段分组,保证结果每条记录对应原查询的一行主表数据,排序逻辑和原查询保持一致。
内容的提问来源于stack exchange,提问作者ALiii
相关产品推荐
相关产品推荐

