我有3张桌子:
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)
,则没有变化,因为我已经在JOIN之前选择了不同的车辆ID;加入后它们只是非独特的。如果我使用WHERE person_id = 1
,我删除最后2行,所有对货车的引用都消失了。如果我使用GROUP BY car_id
,则会合并第一行和最后一行,但摩托车的date_bought
是任意选择的。我想要的是这个:
1, 1, motorcycle, 2009
1, 2, car, 2008
, 3, van,
我需要一个不同的汽车ID,但这发生在JOIN之前,所以根本没有效果。如何通过JOIN获得唯一性?
答案 0 :(得分:6)
您需要在联接中包含对人员ID的限制,并使用外部联接。即使您要加入的表中没有记录,也希望返回信息时使用外部联接。尝试
SELECT person_id, vehicles.*
FROM vehicles
LEFT OUTER JOIN Owners on vehicles.vehicle_id = owners.vehicle_id
and person_id = 1
答案 1 :(得分:3)
这应该返回您列出的预期输出:
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
请注意,由于左连接,如果OWNERS表中没有匹配的vehicle_id
,OWNERS列将返回NULL。