En utilisant LEFT OUTER JOIN, vos 3 requêtes peuvent être effectuées comme suit :-
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()
Ici, il fait une jointure externe gauche pour toutes les dates d'expiration d'assurance ultérieures et vérifie si i2.id est NULL pour s'assurer qu'aucune date d'expiration ultérieure n'est trouvée, puis vérifie la date d'expiration trouvée pour vérifier qu'elle a expiré.
SELECT vehicles.ID
FROM vehicles
LEFT OUTER JOIN insurance i1
ON vehicles.ID = i1.vehicle_ID
WHERE i1.id IS NULL
Cela vérifie simplement qu'il n'y a pas de dossier d'assurance correspondant
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()
Très similaire à la première requête, il fait une jointure externe gauche pour toutes les dates d'expiration d'assurance ultérieures et vérifie si i2.id est NULL pour s'assurer qu'aucune date d'expiration ultérieure n'est trouvée, puis vérifie la date d'expiration trouvée pour vérifier qu'elle n'a pas expiré .