如何在 SQL 中 select 一个 table 中具有相同 ID 的多个值

How to select many values with the same ID in one table in SQL

我已经尝试了几个小时,但仍然没有收到预期的结果。

我有 Table 个包含客户 ID 和产品名称的 A。我想写一个 SQL 来查找购买了产品 A 但没有购买产品 C 的客户

Table答:

客户编号 产品名称
001 一个
001 B
001 C
002 一个
002 B
003 一个
003 C
004 一个
005 B
006 C

预期结果:

客户编号 产品名称
002 一个
002 B
004 一个
  1. Select 来自 table 其中乘积等于 A 或 B
  2. 在产品等于 C
  3. 的客户上左加入 table
  4. 添加 WHERE 左联接产品为空
 create table TableA(Customer_ID varchar(10),   Product_Name varchar(10));
 insert into TableA values('001'    ,'A');
 insert into TableA values('001'    ,'B');
 insert into TableA values('001'    ,'C');
 insert into TableA values('002'    ,'A');
 insert into TableA values('002'    ,'B');
 insert into TableA values('003'    ,'A');
 insert into TableA values('003'    ,'C');
 insert into TableA values('004'    ,'A');
 insert into TableA values('005'    ,'B');
 insert into TableA values('006'    ,'C');

查询#1(用于):

 select * from TableA 
 where customer_id in (select customer_id from TableA where product_name='A')
 and customer_id not in (select customer_id from TableA where product_name='C')
Customer_ID Product_Name
002 A
002 B
004 A

查询#2(使用存在):

 select * from TableA A
 where exists (select 1 from TableA B where product_name='A' and A.customer_id=B.customer_id) 
 and not exists (select 1 from TableA C where product_name='C' and A.customer_id=C.customer_id) 

输出:

Customer_ID Product_Name
002 A
002 B
004 A

db<>fiddle here

如果每个 product/customer 只有一行,请使用 not exists:

select customer
from t
where product = 'A' and
      not exists (select 1 from t t2 where t2.customer = t.customer and t2.product = 'C');

如果 customer/product 行重复,这可能 return 重复。

另一种方法是使用聚合:

select customer
from t
where product in ('A', 'C')
group by customer
having min(product) = max(product) and min(product) = 'A';

另一个选项:

SELECT *
FROM A
WHERE ProductName = 'A' 
      AND CustomerID NOT IN (SELECT CustomerID 
                             FROM A 
                             WHERE ProductName = 'C');

我使用子查询获取购买产品 C 的客户 ID 并将其从结果中排除。

这样就可以了

select * from TableA
where Customer_ID not in
    (select distinct Customer_ID
    from TableA
    where Product_Name = 'C')
and Customer_ID in
    (select distinct Customer_ID
    from TableA
    where Product_Name = 'A')