SQL分组查询结果去重求助:如何将多行查询结果合并为单行
问题分析与解决方案
你当前查询返回3行结果的原因很明确:tblAlternates表中同一个ProductID对应了多条包含%TYT%的matchingmodels记录,左连接后每条匹配的替代型号记录都会和tblProducts中的同一条产品行关联,从而产生了重复的产品数据。
下面给你几种能得到唯一产品行的解决方案:
方案1:用DISTINCT直接去重
这是最直观的方法,在SELECT后加上DISTINCT关键字,就能自动合并重复的产品行:
SELECT DISTINCT p.ProductID, p.PartNo, p.Description FROM tblProducts p LEFT JOIN ( SELECT productid, matchingmodels FROM tblAlternates GROUP BY productid, matchingmodels ) alt ON p.productid = alt.productid WHERE alt.matchingmodels LIKE '%TYT%'
方案2:改用EXISTS子查询(性能更优)
如果你的需求只是确认该产品是否存在符合条件的替代型号,不需要返回matchingmodels字段的话,EXISTS子查询是更好的选择。它只判断是否存在匹配记录,不会产生连接后的重复行,性能也更高:
SELECT p.ProductID, p.PartNo, p.Description FROM tblProducts p WHERE EXISTS ( SELECT 1 FROM tblAlternates alt WHERE alt.productid = p.productid AND alt.matchingmodels LIKE '%TYT%' )
方案3:主查询按产品字段分组
因为ProductID应该是tblProducts的主键,你也可以在主查询中按产品的唯一字段分组,确保每个产品只返回一行:
SELECT p.ProductID, p.PartNo, p.Description FROM tblProducts p LEFT JOIN ( SELECT productid, matchingmodels FROM tblAlternates GROUP BY productid, matchingmodels ) alt ON p.productid = alt.productid WHERE alt.matchingmodels LIKE '%TYT%' GROUP BY p.ProductID, p.PartNo, p.Description
额外说明
这三种方案里,EXISTS的性能通常是最好的,尤其是当tblAlternates数据量较大时——它不需要处理连接后的多行数据,只要找到第一条匹配的记录就会停止判断,效率更高。
内容的提问来源于stack exchange,提问作者Muzamil Sajid
相关产品推荐
相关产品推荐

