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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:39:52