您好我认为我忽略了使用sql db2的问题。我有两个栏目 - 人和车。我想找到那些同时购买了麦克拉伦和法拉利的人。
我做了:
select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
然而,这并没有让人回归,即使有人看到这些数据,也有人买了两个。必须有办法挑选那些购买两者的人。有什么想法吗?
答案 0 :(得分:3)
此问题是为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'
答案 1 :(得分:1)
有几种方法。
一种简单的方法是选择购买一辆汽车的人,然后使用内部联接将他们与购买另一辆汽车的人匹配。
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 :(得分:1)
好老内心加入怎么样?如果有人买了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'