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

SQL关联查询返回重复产品记录,如何获取唯一product_id?

解决产品分类关联查询的重复记录问题

这问题我平时写SQL时经常碰到,核心原因就是一个产品在Katigories表中对应了多条分类记录,和Products表关联后,每条分类记录都会带出一次产品信息,自然就出现重复了。给你几个实用的解决办法,按需选就行:

方法1:用DISTINCT直接去重(修改原查询的最优解)

把原来的隐式连接改成更清晰的显式JOIN,再加上DISTINCT关键字剔除重复的产品记录:

SELECT DISTINCT p.*
FROM dbo.Katigories k
INNER JOIN dbo.Products p 
    ON k.product_id = p.product_id
WHERE k.Cat_Main_ID = -- 替换为URL查询字符串中的Cat_Main_ID参数
  AND k.Cat_Sub_ID = -- 替换为URL查询字符串中的Cat_Sub_ID参数

原理很简单:DISTINCT会自动合并所有完全相同的Products记录,哪怕同一个产品有多个匹配的分类条目,最终只会保留一条产品信息。

方法2:用EXISTS子查询(性能更优的选择)

如果你的数据量比较大,EXISTS子查询的性能通常会更好,它只验证是否存在符合条件的分类关联,不会返回多余的重复数据:

SELECT p.*
FROM dbo.Products p
WHERE EXISTS (
    SELECT 1
    FROM dbo.Katigories k
    WHERE k.product_id = p.product_id
      AND k.Cat_Main_ID = -- 替换为URL查询字符串中的Cat_Main_ID参数
      AND k.Cat_Sub_ID = -- 替换为URL查询字符串中的Cat_Sub_ID参数
)

这里SELECT 1只是用来做存在性判断,数据库不会实际返回这列的值,效率很高。

方法3:用IN子查询(逻辑更直观的写法)

先从分类表中筛选出符合条件的所有唯一产品ID,再用这个ID集合去查询产品表:

SELECT p.*
FROM dbo.Products p
WHERE p.product_id IN (
    SELECT k.product_id
    FROM dbo.Katigories k
    WHERE k.Cat_Main_ID = -- 替换为URL查询字符串中的Cat_Main_ID参数
      AND k.Cat_Sub_ID = -- 替换为URL查询字符串中的Cat_Sub_ID参数
)

子查询会自动去重product_id,所以最终返回的产品记录肯定是唯一的。

另外提一句:你原来用逗号连接两张表的写法是旧式的隐式连接,推荐改用显式JOIN语法,不仅可读性更强,也能避免不小心写出笛卡尔积的错误。

内容的提问来源于stack exchange,提问作者Freddakos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:35:27