我到处都看了看,但我似乎无法找到这个问题的答案。
我正在开发一个数据库项目。我有一张包含汽车及其颜色的桌子。
它有这样的结构:
owner_id || car_make || car_color
001 || ford || red
001 || ford || blue
002 || chevy || red
002 || Telsa || blue
002 || ford || green
003 || chevy || red
004 || chevy || red
004 || Telsa || blue
005 || ford || red
005 || ford || blue
我希望能够显示拥有相同颜色汽车的所有车主的owner_id列表,并将其作为另一个车主。 例如,如果我选择所有者001拥有的所有汽车,我会得到
owner_id || car_make || car_color
001 || ford || red
001 || ford || blue
我可以用什么SQL来获取拥有红色福特和蓝色福特的其他所有者的user_id列表?
我想要005返回,因为拥有者005拥有红色福特和蓝色福特,与拥有者001相同
我知道SQL不支持这样的划分,并且我尝试过其他方法,例如减号而不存在,但我必须做错误,因为我得到的只是错误,或者只是错误的结果。
再次,如果已经回答这个问题,那么道歉,以及我的英语不好
答案 0 :(得分:1)
这将显示某人拥有品牌和颜色的汽车的所有情况,这些汽车都与至少一个其他所有者拥有的所有汽车完全相同。
select *
from tbl x
where not exists (select 1
from tbl y
where y.car_make <> x.car_make
and y.car_color <> x.car_color
and y.owner_id <> x.owner_id)
答案 1 :(得分:1)
这应该有效 - 它会创建一个所有者001品牌和颜色的列表,将所有其他所有者加入到列表中,并且只包括那些匹配所有所有者001的汽车的所有者:
WITH
Owner001_Cars AS (
SELECT car_make, car_color
FROM myTable
WHERE owner_id = '001')
SELECT owner_id
FROM myTable
INNER JOIN Owner001_Cars USING (car_make, car_color)
WHERE owner_id <> '001'
GROUP BY owner_id
HAVING COUNT(*) = (SELECT COUNT(*) FROM Owner001_Cars)