代码之家  ›  专栏  ›  技术社区  ›  Rupert Madden-Abbott

在联接后选择不同的值

  •  4
  • Rupert Madden-Abbott  · 技术社区  · 16 年前

    我有三张桌子:

    Vehicle: vehicle_id, vehicle_type
    1, motorcycle
    2, car
    3, van
    
    Owners: person_id, vehicle_id, date_bought
    1, 1, 2009
    1, 2, 2008
    2, 3, 2009
    2, 1, 2005
    

    person_id = 1 , date_bought

    所以我想我应该从这个开始:

    SELECT * FROM vehicles
    LEFT JOIN Owners USING (vehicle_id)
    

    其中返回以下内容:

    1, 1, motorcycle, 2009
    1, 2, car, 2008
    2, 3, van, 2009
    2, 1, motorcycle, 2005
    

    然而,我现在无法将其缩小到所需的结果。如果我使用 DISTINCT(car_id) ,没有变化,因为我在加入之前已经选择了不同的车辆ID;它们仅在联接后不明显。如果我使用 WHERE person_id = 1 ,我删除了最后两行,所有对van的引用都消失了。如果我使用 GROUP BY car_id ,第一行和最后一行合并,但 购买日期

    1, 1, motorcycle, 2009
    1, 2, car, 2008
     , 3, van, 
    

    2 回复  |  直到 16 年前
        1
  •  8
  •   Robert Christie    16 年前

    您需要在加入中包含对个人id的限制,并使用外部加入。当您希望返回信息时,即使您要加入的表中没有记录,也会使用外部联接。尝试

    SELECT person_id, vehicles.* 
    FROM vehicles 
    LEFT OUTER JOIN Owners on vehicles.vehicle_id = owners.vehicle_id 
    and person_id = 1
    
        2
  •  3
  •   OMG Ponies    16 年前

    这将返回您列出的预期输出:

       SELECT DISTINCT
              o.person_id,
              v.vehicle_id,
              v.vehicle_type,
              o.date_bought
         FROM VEHICLES v
    LEFT JOIN OWNERS o ON o.vehicle_id = v.vehicle_id
    LEFT JOIN (SELECT t.vehicle_id,
                      MAX(t.date_bought) 'max_date_bought'
                FROM OWNERS t
            GROUP BY t.vehicle_id) x ON x.vehicle_id = o.vehicle_id
                                    AND x.max_date_bought = o.date_bought
        WHERE o.person_id IS NULL 
           OR o.person_id = 1
    

    vehicle_id 在所有者表中。