Debug ~1 min de lecture

Éviter de compter deux fois un montant après une jointure

Un total SQL double après une jointure ? Les données ne sont pas forcément en double.

Trois colonnes : les données contiennent une commande de 100 CHF avec deux lignes ; JOIN produit deux résultats de 100 CHF et une somme incorrecte de 200 CHF ; EXISTS conserve une seule commande et une somme de 100 CHF.
Le diagramme montre pourquoi une jointure double le montant d’une commande à deux lignes, alors que EXISTS vérifie leur présence sans multiplier le montant.

Une commande de 100 CHF contient deux lignes. Après une jointure entre commandes et lignes, le montant de la commande apparaît dans deux résultats. Appliquer SUM(c.total) à ces résultats donne 200 CHF.

Le premier soupçon peut être une commande enregistrée en double. Pour le vérifier, comparer les résultats avant et après la jointure. Si un même identifiant de commande apparaît une fois avant et deux fois après, la relation un-à-plusieurs explique la multiplication du montant.

Si la jointure sert uniquement à sélectionner les commandes ayant au moins une ligne, utiliser EXISTS : SELECT SUM(c.total) FROM commandes c WHERE EXISTS (SELECT 1 FROM lignes l WHERE l.commande_id = c.id); Cette condition vérifie la présence d’une ligne sans multiplier les commandes à additionner.

Une jointure peut multiplier les lignes : vérifier ce que chaque ligne représente avant de calculer une somme.

Dans le même esprit

À lire ensuite