SQLite查询购买商品A但未购B的客户:现有SQL返回错误结果求助
解决“购买商品'A'但未购买商品'B'的客户”查询问题
你的原SQL语句逻辑完全搞反啦,NOT item = 'A' AND item = 'B' 其实是在找**购买了商品'B'且没购买'A'**的客户——而且因为是单条记录判断,要是客户同时买了A和B,他们的B记录会被这条语句选中,所以才会出现同时买两种的客户出现在结果里,这和你要的“买了A但没买B”需求刚好相反。
下面给你几种在SQLite里能用的正确写法,按需选择:
方法1:子查询排除法(直观易懂)
先找出所有买过A的客户,再排除其中买过B的:
SELECT DISTINCT customerName FROM Customers WHERE item = 'A' AND customerName NOT IN ( SELECT customerName FROM Customers WHERE item = 'B' );
加DISTINCT是为了避免同一个客户多次购买A导致结果重复。
方法2:EXISTS子查询(大数据量更高效)
用EXISTS判断客户是否存在购买B的记录,逻辑更严谨,大数据场景下性能更好:
SELECT DISTINCT c.customerName FROM Customers c WHERE c.item = 'A' AND NOT EXISTS ( SELECT 1 FROM Customers c2 WHERE c2.customerName = c.customerName AND c2.item = 'B' );
方法3:LEFT JOIN筛选法(关联查询思路)
通过左连接买过B的客户记录,筛选出连接后无匹配B记录的客户:
SELECT DISTINCT c1.customerName FROM Customers c1 LEFT JOIN Customers c2 ON c1.customerName = c2.customerName AND c2.item = 'B' WHERE c1.item = 'A' AND c2.customerName IS NULL;
小提醒:如果你的表有唯一的客户ID(比如customerId),用客户ID代替customerName会更准确,毕竟可能存在重名的客户哦。
内容的提问来源于stack exchange,提问作者rakez25
相关产品推荐
相关产品推荐

