0

嗨,我想我忽略了使用 sql db2 的问题。我有两列 - 人和汽车。我想找到买过迈凯轮和法拉利的人。

我已经做好了:

select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'

不过这个是没有人退的,虽然看数据,还是有人买了两个。必须有一种方法可以挑选出同时购买了两者的人。任何想法?

4

3 回答 3

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'
于 2013-10-25T16:33:36.697 回答
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

还有很多其他的方法,但现在你已经知道如何去做了。

于 2013-10-25T05:08:47.257 回答
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'
于 2013-10-25T13:48:25.390 回答