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

如何在T-SQL中实现目标筛选?AND逻辑未达预期效果

解决T-SQL筛选从未购买Apple的客户记录问题

原查询问题分析

你的原查询:

select *
from Sales
where Purchased = 'Orange' and Purchased != 'Apple'

是针对单条记录做筛选,只要某条记录是Orange且不是Apple就会被返回。但Alex虽然买过Orange,同时也买过Apple,所以这条记录不该被包含进去——你需要的是整个客户从未购买过Apple,再筛选他们的Orange记录。

正确的查询方法

方法1:使用NOT EXISTS排除买过Apple的客户

SELECT s.*
FROM Sales s
WHERE s.Purchased = 'Orange'
  AND NOT EXISTS (
    SELECT 1
    FROM Sales s2
    WHERE s2.CustomerID = s.CustomerID
      AND s2.Purchased = 'Apple'
  )

这个查询先找到所有购买Orange的记录,再排除掉那些客户ID存在对应Apple购买记录的条目,最终只保留从未买过Apple的客户的Orange记录。

方法2:使用GROUP BY + HAVING筛选符合条件的客户,再关联原表

SELECT s.*
FROM Sales s
INNER JOIN (
  SELECT CustomerID
  FROM Sales
  GROUP BY CustomerID
  HAVING MAX(CASE WHEN Purchased = 'Apple' THEN 1 ELSE 0 END) = 0
    AND MAX(CASE WHEN Purchased = 'Orange' THEN 1 ELSE 0 END) = 1
) AS valid_customers ON s.CustomerID = valid_customers.CustomerID
WHERE s.Purchased = 'Orange'

子查询先筛选出:没有买过Apple(MAX(CASE...) =0)且至少买过Orange(MAX(CASE...) =1)的客户ID,再关联原表获取对应的Orange记录。

方法3:使用NOT IN排除买过Apple的客户

SELECT *
FROM Sales
WHERE Purchased = 'Orange'
  AND CustomerID NOT IN (
    SELECT CustomerID
    FROM Sales
    WHERE Purchased = 'Apple'
  )

这个方法更简洁,先找出所有买过Apple的客户ID,然后在购买Orange的记录中排除这些ID。

预期结果

执行以上任意查询后,会得到你想要的结果:

CustomerIDCustomerPurchased
2KateOrange

内容的提问来源于stack exchange,提问作者sql-noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:59:59