db2:在同一列中选择两个条件

时间:2013-10-24 21:57:29

标签: db2

您好我认为我忽略了使用sql db2的问题。我有两个栏目 - 人和车。我想找到那些同时购买了麦克拉伦和法拉利的人。

我做了:

select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
然而,这并没有让人回归,即使有人看到这些数据,也有人买了两个。必须有办法挑选那些购买两者的人。有什么想法吗?

3 个答案:

答案 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'