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

db2:在同一列中选择两个条件,db2,Db2,您好,我想我忽略了我在使用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'

然而,这并没有返回任何人,即使仔细查看数据,仍有人同时购买了这两种产品。一定有办法找出那些同时购买了这两种产品的人。有什么想法吗?

有几种方法

一种简单的方法是选择购买了一辆车的人群,并使用内部联接将他们与购买了另一辆车的人群进行匹配

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

还有很多其他的方法,但是现在你已经知道怎么做了。

有几种方法

一种简单的方法是选择购买了一辆车的人群,并使用内部联接将他们与购买了另一辆车的人群进行匹配

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'

好的旧的内部连接怎么样?如果有人买了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'

这个问题是为
INTERSECT
操作符量身定制的,比使用
JOIN
的解决方案更容易阅读/理解

这是基本的集合论:

select person from car_db where car = 'FERRARI'
INTERSECT
select person from car_db where car = 'MCLAREN'
INTERSECT
将自动删除任何重复项。如果您想要重复的
person
记录,可以使用
INTERSECT ALL

注意,您可以使用
操作符查找拥有法拉利但不拥有迈凯轮的人:

select person from car_db where car = 'FERRARI'
EXCEPT
select person from car_db where 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

注意,您可以使用
操作符查找拥有法拉利但不拥有迈凯轮的人:

select person from car_db where car = 'FERRARI'
EXCEPT
select person from car_db where car = 'MCLAREN'