db2:在同一列中选择两个条件
您好,我想我忽略了我在使用sql db2时遇到的一个问题。我有两个专栏——人和车。我想找到同时购买迈凯轮和法拉利的人 我已经做了:db2:在同一列中选择两个条件,db2,Db2,您好,我想我忽略了我在使用sql db2时遇到的一个问题。我有两个专栏——人和车。我想找到同时购买迈凯轮和法拉利的人 我已经做了: select distinct person,car from car_db where car = 'ferrari' and car = 'mclaren' 然而,这并没有返回任何人,即使仔细查看数据,仍有人同时购买了这两种产品。一定有办法找出那些同时购买了这两种产品的人。有什么想法吗?有几种方法 一种简单的方法是选择购买了一辆车的人群,并使用内部联接将他们与
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'