FULL OUTER JOIN
FULL OUTER JOIN garde toutes les lignes des deux tables, appariées quand c'est possible et complétées par NULL sinon. C'est l'outil du rapprochement entre deux listes ou deux périodes.
- jointure complète
- FULL JOIN
- rapprochement
- réconciliation
Syntaxe
SELECT COALESCE(a.cle, b.cle) AS cle, a.col, b.colFROM table_a aFULL OUTER JOIN table_b b ON b.cle = a.cle;Exemple
WITH fevrier AS ( SELECT oi.product_id, SUM(oi.quantity) AS qte FROM order_items oi JOIN orders o ON o.id = oi.order_id WHERE o.order_date LIKE '2024-02-%' GROUP BY oi.product_id),mars AS ( SELECT oi.product_id, SUM(oi.quantity) AS qte FROM order_items oi JOIN orders o ON o.id = oi.order_id WHERE o.order_date LIKE '2024-03-%' GROUP BY oi.product_id)SELECT p.name AS produit, COALESCE(f.qte, 0) AS qte_fevrier, COALESCE(m.qte, 0) AS qte_marsFROM fevrier fFULL OUTER JOIN mars m ON m.product_id = f.product_idJOIN products p ON p.id = COALESCE(f.product_id, m.product_id)ORDER BY p.id;-- Jeu de données : boutique-- Ventes par produit, février contre mars 2024-- Résultat attendu :-- Souris sans fil | 1 | 1-- Casque audio | 1 | 0-- Webcam HD | 0 | 1-- Enceinte Bluetooth | 0 | 1À retenir
- FULL OUTER JOIN = LEFT JOIN + les lignes de droite sans correspondance. FULL JOIN est un synonyme.
- La clé est NULL d'un côté sur les lignes non appariées : récupérez-la avec COALESCE(f.product_id, m.product_id) avant de la réutiliser.
- Piège : un WHERE sur une colonne d'un seul côté (WHERE f.qte > 0) élimine les lignes complétées par NULL et fait perdre l'intérêt de la jointure complète.
- Disponible dans SQLite 3.39+, PostgreSQL et SQL Server. MySQL n'a pas de FULL JOIN : on l'émule avec un LEFT JOIN UNION un RIGHT JOIN.
Voir aussi
- LEFT JOINLEFT JOIN garde toutes les lignes de la table de gauche, avec ou sans correspondance à droite (les colonnes de droite valent alors NULL). Idéal pour compter des zéros ou repérer des absents.
- RIGHT JOINRIGHT JOIN est le miroir du LEFT JOIN : il garde toutes les lignes de la table de droite, complétées par NULL à gauche. Disponible dans SQLite depuis la 3.39, donc dans le playground.
- COALESCE & CASECASE introduit une logique « si… alors… sinon » dans une requête, COALESCE renvoie la première valeur non NULL. Ils servent à classer des lignes en catégories ou à remplacer une valeur manquante.
- WITH (CTE)Une CTE (WITH) donne un nom à un résultat intermédiaire, utilisable ensuite comme une table dans la requête. On découpe ainsi un calcul complexe en étapes lisibles et vérifiables.