Oracle SQL Division通过设置未知的元素

时间:2014-04-13 20:16:32

标签: sql oracle division

我到处都看了看,但我似乎无法找到这个问题的答案。

我正在开发一个数据库项目。我有一张包含汽车及其颜色的桌子。

它有这样的结构:

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不支持这样的划分,并且我尝试过其他方法,例如减号而不存在,但我必须做错误,因为我得到的只是错误,或者只是错误的结果。

再次,如果已经回答这个问题,那么道歉,以及我的英语不好

2 个答案:

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