嗨,我想我忽略了使用 sql db2 的问题。我有两列 - 人和汽车。我想找到买过迈凯轮和法拉利的人。
我已经做好了:
select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
不过这个是没有人退的,虽然看数据,还是有人买了两个。必须有一种方法可以挑选出同时购买了两者的人。任何想法?
嗨,我想我忽略了使用 sql db2 的问题。我有两列 - 人和汽车。我想找到买过迈凯轮和法拉利的人。
我已经做好了:
select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
不过这个是没有人退的,虽然看数据,还是有人买了两个。必须有一种方法可以挑选出同时购买了两者的人。任何想法?
这个问题是为操作员量身定做的INTERSECT
,比使用JOIN
.
基本集合论:
select person from car_db where car = 'FERRARI'
INTERSECT
select person from car_db where car = 'MCLAREN'
INTERSECT
将自动删除所有重复项。如果您想要重复person
记录,您可以使用INTERSECT ALL
.
请注意,您可以使用EXCEPT
运算符来查找拥有法拉利但不拥有迈凯轮的人:
select person from car_db where car = 'FERRARI'
EXCEPT
select person from car_db where car = 'MCLAREN'
有几种方法。
一种简单的方法是选择购买了一辆车的人的集合,并使用内部连接将他们与购买另一辆车的人进行匹配。
WITH F AS
(SELECT DISTINCT PERSON
FROM CAR_PURCHASES
WHERE CAR = 'FERRARI'
), M AS
(SELECT DISTINCT PERSON
FROM CAR_PURCHASES
WHERE CAR ='MCLAREN'
)
SELECT F.PERSON
FROM F JOIN M ON f.person = m.person
另一个可能是使用分组
WITH Q AS
(SELECT PERSON,
MAX( CASE WHEN CAR='FERRARI' THEN 1 ELSE 0 END) AS BOUGHT_FERRARI,
MAX( CASE WHEN CAR='MCLAREN' THEN 1 ELSE 0 END) AS BOUGHT_MCLAREN
FROM CAR_PURCHASES
GROUP BY PERSON
)
SELECT PERSON
FROM Q
WHERE BOUGHT_FERRARI > 0
AND BOUGHT_MCLAREN > 0
ORDER BY PERSON
还有很多其他的方法,但现在你已经知道如何去做了。
旧的内部连接怎么样?如果有人买了 2 辆法拉利或 2 辆迈凯轮,您需要与众不同。
select distinct F.PERSON
from CAR_PURCHASES F inner join CAR_PURCHASES M on F.PERSON = M.PERSON
where F.CAR = 'FERRARI'
and M.CAR = 'MCLAREN'