Usando LEFT OUTER JOIN, sus 3 consultas se pueden hacer como:-
SELECT vehicles.ID
FROM vehicles
INNER JOIN insurance i1
ON vehicles.ID = i1.vehicle_ID
LEFT OUTER JOIN insurance i2
ON i1.vehicle_ID = i2.vehicle_ID
AND i2.expire > i1.expire
WHERE i2.id IS NULL
AND i1.expire < NOW()
Aquí hace una combinación externa izquierda para cualquier fecha de vencimiento posterior del seguro, y verifica que i2.id sea NULL para garantizar que no se encuentre una fecha de vencimiento posterior, y luego verifica la fecha de vencimiento encontrada para verificar que haya vencido.
SELECT vehicles.ID
FROM vehicles
LEFT OUTER JOIN insurance i1
ON vehicles.ID = i1.vehicle_ID
WHERE i1.id IS NULL
Esto solo verifica que no haya un registro de seguro coincidente
SELECT vehicles.ID
FROM vehicles
INNER JOIN insurance i1
ON vehicles.ID = i1.vehicle_ID
LEFT OUTER JOIN insurance i2
ON i1.vehicle_ID = i2.vehicle_ID
AND i2.expire > i1.expire
WHERE i2.id IS NULL
AND i1.expire >= NOW()
Muy similar a la primera consulta, hace una combinación externa izquierda para cualquier fecha de vencimiento posterior del seguro y verifica que i2.id sea NULL para asegurarse de que no se encuentre una fecha de vencimiento posterior, y luego verifica la fecha de vencimiento encontrada para verificar que no haya vencido. .