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
相关产品推荐
相关产品推荐

