如何查询与指定ArticleID集合完全匹配的购物车ID
找出恰好包含指定商品集合的购物车
需求说明
现有article、shopping cart、ShoppingCartArticle三张表构成多对多关联,需修改查询逻辑,找出**恰好包含指定ArticleID集合(示例为1、2)**的购物车,期望输出购物车ID 1。
解决思路
要实现“恰好包含”的判断,需同时满足两个核心条件:
- 购物车关联的所有商品ID都属于指定集合
- 购物车关联的商品数量与指定集合的商品数量完全相等
另外,由于@ArticleList是字符串格式的ID列表,需要先将其拆分为可用于关联查询的表结构。
实现代码
DECLARE @ArticleList VARCHAR(MAX) = '1,2'; -- 将字符串ID列表转为行数据 WITH SplitArticles AS ( SELECT CAST(value AS INT) AS ArticleID FROM STRING_SPLIT(@ArticleList, ',') ), -- 统计每个购物车的商品总数、匹配指定集合的商品数 CartArticleStats AS ( SELECT sca.ShoppingCartID, COUNT(*) AS TotalArticles, SUM(CASE WHEN sa.ArticleID IS NOT NULL THEN 1 ELSE 0 END) AS MatchedArticles FROM ShoppingCartArticle sca LEFT JOIN SplitArticles sa ON sca.ArticleID = sa.ArticleID GROUP BY sca.ShoppingCartID ), -- 获取指定集合的商品总数 TargetArticleCount AS ( SELECT COUNT(*) AS Count FROM SplitArticles ) SELECT cas.ShoppingCartID FROM CartArticleStats cas CROSS JOIN TargetArticleCount tac WHERE cas.TotalArticles = tac.Count AND cas.MatchedArticles = tac.Count;
代码说明
- SplitArticles:使用
STRING_SPLIT函数将字符串格式的ID列表拆分为独立行(该函数适用于SQL Server 2016及以上版本),方便后续关联判断。 - CartArticleStats:按购物车ID分组,统计每个购物车的总商品数,以及其中属于指定集合的商品数量。
- TargetArticleCount:统计指定集合的商品总数,作为判断“恰好包含”的基准值。
- 最终查询:筛选出总商品数等于指定集合数量、且匹配商品数也等于指定集合数量的购物车,确保购物车仅包含指定的所有商品,无额外商品。
内容的提问来源于stack exchange,提问作者dimitro
相关产品推荐
相关产品推荐

