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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:57