【问题标题】:Finding all cars who use the same parts types查找所有使用相同零件类型的汽车
【发布时间】:2014-11-27 12:34:24
【问题描述】:

给定表格:

parts (part_id, part_desc, type_id, car_id)
types (type_id, type_name)
cars (car_id, car_model, car_make)

我想查找拥有属于“Honda”品牌和“Civic”型号的所有类型零件的汽车的 ID、型号和品牌。也就是说,如果 Honda Civic 有 A,B,C 类型,那么它将找到所有具有属于 A AND BC 的零件的汽车。

我不确定如何执行此操作,但我设法为A OR B OR C 执行此操作

SELECT DISTINCT c.car_id, c.car_model, c.car_make
FROM cars c, parts p
WHERE c.car_id= p.car_id AND p.type_id IN (
       SELECT p.type_id FROM cars c, parts p
       WHERE a.car_id = p.car_id
       AND a.car_model = 'Civic' 
       AND a.car_make = 'Honda'
)

innerquery 获取 Honda Civic 的所有类型的零件,但如果汽车只有 A,B,C 中的 1 个而不是全部,则 IN() 子句将匹配汽车。

我想避免使用ALLANY 集合运算符。 A,B,C 也是一个例子,不要在答案中硬编码。子查询的结果将是未知的。

【问题讨论】:

    标签: mysql sql oracle sqlite


    【解决方案1】:

    为避免使用“全部”之类的词,请使用两个否定来重新表述问题:
    您想要的汽车没有本田思域拥有但该车没有的类型。

    SELECT *
    FROM cars
    WHERE NOT EXISTS (SELECT 1
                      FROM types CivicTypes
                      JOIN parts CivicParts USING (type_id)
                      WHERE car_id = (SELECT car_id
                                      FROM cars
                                      WHERE car_make = 'Honda'
                                        AND car_model = 'Civic')
                        AND NOT EXISTS (SELECT 1
                                        FROM types JOIN parts USING (type_id)
                                        WHERE type_id = CivicTypes.type_id
                                          AND car_id = cars.car_id)
                     )
    

    【讨论】:

      【解决方案2】:
      with t as ( -- first find out all the type_id belonging to Honda civic
      select distinct p.type_id
        from cars c
            ,parts p
       where c.car_model = 'Civic' 
         and c.car_make = 'Honda'
         and c.car_id = p.car_id
      )  
      ,c as ( -- find which car has which part types
      select distinct
             c.car_id
            ,c.car_make
            ,c.car_model
            ,t.type_id
        from t
            ,parts p
            ,cars  c
       where t.type_id = p.type_id
         and p.car_id = c.car_id
      )
      -- the number of the records in c for each car meeting conditions must be equal to 
      -- the number of part types
      select c.car_id
            ,c.car_make
            ,c.car_model
        from c
       group
          by c.car_id
            ,c.car_make
            ,c.car_model
      having count(0) = (select count(0) from t)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        相关资源
        最近更新 更多