如何在 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
一个
- Select 来自 table 其中乘积等于 A 或 B
- 在产品等于 C
的客户上左加入 table
- 添加 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')
我已经尝试了几个小时,但仍然没有收到预期的结果。
我有 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 | 一个 |
- Select 来自 table 其中乘积等于 A 或 B
- 在产品等于 C 的客户上左加入 table
- 添加 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')