SQL Pratique
LATERAL JOIN en SQL : guide pratique pour débuter
8 min de lecture

LATERAL JOIN en SQL : guide pratique pour débuter

Découvrez LATERAL JOIN en SQL : syntaxe, cas d'usage et exemples concrets pour réussir vos entretiens data. Guide complet en Français.

Avatar de Thomas LeroyThomas Leroy

Le LATERAL JOIN est l'une des fonctionnalités SQL les plus méconnues, et pourtant régulièrement présentes dans les entretiens data senior. En une phrase : un LATERAL JOIN permet à une sous-requête de faire référence aux colonnes de la table qui la précède dans la clause FROM, ce qu'une jointure classique ne permet pas. Cette capacité ouvre la porte à des requêtes bien plus expressives, notamment pour les analyses de séries temporelles, les top-N par groupe ou les calculs corrélés. Si vous préparez un entretien technique ou cherchez à écrire des requêtes plus propres, maîtriser cette syntaxe est un véritable avantage. Ce guide vous explique tout, de la syntaxe de base aux cas d'usage réels, avec des exemples prêts à exécuter.

📌 Ce qu'il faut retenir

  • Un LATERAL JOIN évalue sa sous-requête ligne par ligne en accédant aux colonnes de la table externe.
  • Il est disponible nativement en PostgreSQL, MySQL 8.0+ et BigQuery ; SQL Server utilise l'équivalent CROSS APPLY.
  • Le principal cas d'usage est le top-N par groupe, plus lisible qu'une fenêtre de ranking.
  • Une jointure LATERAL peut retourner 0 ligne par défaut : utilisez LEFT JOIN LATERAL ... ON TRUE pour conserver toutes les lignes de gauche.

Pourquoi le LATERAL JOIN change la donne

Dans une requête SQL classique, chaque table de la clause FROM est indépendante des autres. Une sous-requête dans le FROM ne peut pas "regarder" les valeurs d'une table placée avant elle dans la liste. C'est exactement cette contrainte que le LATERAL lève.

Concrètement, imaginez une table clients et une table commandes. Vous voulez, pour chaque client, récupérer ses 3 dernières commandes. Sans LATERAL, vous devez passer par une fonction fenêtre avec ROW_NUMBER ou une sous-requête corrélée dans le SELECT. Avec LATERAL, la logique devient linéaire et beaucoup plus lisible.

Ce mécanisme s'apparente à une boucle implicite : pour chaque ligne de la table principale, la sous-requête est réévaluée avec les valeurs courantes de cette ligne.

Syntaxe de base du LATERAL JOIN

Voici la forme canonique en PostgreSQL :

SELECT c.nom, d.montant, d.date_commande
FROM clients c
JOIN LATERAL (
    SELECT montant, date_commande
    FROM commandes
    WHERE commandes.client_id = c.id
    ORDER BY date_commande DESC
    LIMIT 3
) d ON TRUE;

La clause ON TRUE indique qu'il n'y a pas de condition de jointure supplémentaire : toutes les lignes produites par la sous-requête sont conservées. Notez que c.id est accessible à l'intérieur de la sous-requête grâce au mot-clé LATERAL.

Pour conserver les clients sans aucune commande, remplacez JOIN par LEFT JOIN :

SELECT c.nom, d.montant, d.date_commande
FROM clients c
LEFT JOIN LATERAL (
    SELECT montant, date_commande
    FROM commandes
    WHERE commandes.client_id = c.id
    ORDER BY date_commande DESC
    LIMIT 3
) d ON TRUE;

💡 Bon à savoir

En PostgreSQL, la fonction UNNEST() utilisée dans le FROM est implicitement un LATERAL. Inutile donc d'écrire le mot-clé explicitement dans ce cas précis.

LATERAL vs CROSS APPLY : quelle différence ?

SQL Server et Azure SQL ne connaissent pas le mot-clé LATERAL. Ils proposent à la place CROSS APPLY (équivalent du JOIN LATERAL) et OUTER APPLY (équivalent du LEFT JOIN LATERAL). La logique est identique, seule la syntaxe change.

Concept PostgreSQL / MySQL / BigQuery SQL Server / Azure SQL Comportement
Jointure latérale classique JOIN LATERAL ... ON TRUE CROSS APPLY Exclut les lignes sans correspondance
Jointure latérale optionnelle LEFT JOIN LATERAL ... ON TRUE OUTER APPLY Conserve toutes les lignes de gauche (NULL si vide)
Disponibilité PostgreSQL 9.3+, MySQL 8.0+, BigQuery SQL Server 2005+ —

Oracle supporte LATERAL depuis la version 12c. En revanche, SQLite ne le supporte pas nativement à ce jour.

Les 3 cas d'usage concrets en entretien

1. Top-N par groupe

C'est le cas le plus fréquent en entretien. On veut les N meilleurs résultats pour chaque entité parente.

-- Les 2 produits les plus vendus par catégorie
SELECT cat.nom AS categorie, top_produits.nom AS produit, top_produits.ventes
FROM categories cat
JOIN LATERAL (
    SELECT nom, ventes
    FROM produits
    WHERE produits.categorie_id = cat.id
    ORDER BY ventes DESC
    LIMIT 2
) top_produits ON TRUE;

Cette requête est plus lisible qu'une CTE avec ROW_NUMBER, surtout quand la logique de filtrage est complexe.

2. Calcul d'une valeur agrégée corrélée

Imaginez que vous voulez, pour chaque employé, connaître le salaire moyen des collègues de son département. Sans LATERAL, cela nécessite une sous-requête corrélée dans le SELECT. Avec LATERAL, le calcul vit dans le FROM et peut être réutilisé dans plusieurs colonnes du SELECT :

SELECT e.nom, e.salaire, stats.salaire_moyen_dept
FROM employes e
JOIN LATERAL (
    SELECT AVG(salaire) AS salaire_moyen_dept
    FROM employes e2
    WHERE e2.departement_id = e.departement_id
      AND e2.id != e.id
) stats ON TRUE;

3. Génération de séries de dates corrélées

En combinant LATERAL avec generate_series() (PostgreSQL), on peut générer des plages de dates propres à chaque projet ou contrat :

SELECT p.nom AS projet, s.jour
FROM projets p
JOIN LATERAL (
    SELECT generate_series(p.date_debut, p.date_fin, INTERVAL '1 day')::date AS jour
) s ON TRUE;

Ce pattern est particulièrement utile pour remplir des calendriers ou détecter des jours sans activité.

⚠️ Attention

Un LATERAL JOIN évalue la sous-requête pour chaque ligne de la table externe. Sur de très grandes tables sans index adapté, cela peut produire des scans répétés et dégrader significativement les performances. Vérifiez toujours le plan d'exécution avec EXPLAIN ANALYZE avant de mettre en production.

LATERAL JOIN vs sous-requête corrélée : quand choisir ?

Une sous-requête corrélée dans le SELECT peut souvent faire la même chose qu'un LATERAL JOIN, mais avec des limitations importantes. Elle ne peut retourner qu'une seule valeur scalaire (1 ligne, 1 colonne). Le LATERAL JOIN, lui, peut retourner plusieurs lignes et plusieurs colonnes.

De plus, un LATERAL JOIN produit des colonnes exploitables directement dans le SELECT principal, sans répéter la logique. Si vous avez besoin de 3 métriques calculées sur la même sous-table, un LATERAL évite d'écrire 3 sous-requêtes indépendantes.

En résumé :

  • Utilisez une sous-requête corrélée pour un seul scalaire simple.
  • Utilisez un LATERAL JOIN dès que vous avez besoin de plusieurs colonnes ou de plusieurs lignes par ligne parente.

Questions fréquentes

Le LATERAL JOIN est-il disponible dans MySQL ?

Oui, depuis MySQL 8.0. Les versions antérieures ne le supportent pas. Si votre environnement tourne encore sur MySQL 5.7, vous devrez simuler ce comportement avec des sous-requêtes corrélées ou des variables utilisateur, ce qui est nettement moins lisible.

Quelle est la différence entre LATERAL et une vue ?

Une vue est un objet persistant dans la base de données, défini indépendamment de toute requête. Un LATERAL JOIN est une sous-requête inline qui peut accéder aux colonnes de la table courante. Les 2 ne s'opposent pas : on peut créer une vue qui contient elle-même un LATERAL JOIN.

Un LATERAL JOIN peut-il remplacer une fonction fenêtre ?

Pas toujours, mais dans le cas du top-N par groupe, les 2 approches sont interchangeables. Le LATERAL avec LIMIT est souvent plus lisible et parfois plus rapide, car il évite de calculer le rang pour toutes les lignes avant de filtrer. Les fonctions fenêtre comme ROW_NUMBER restent plus adaptées quand on a besoin du rang lui-même en tant que valeur dans le résultat.

Peut-on imbriquer plusieurs LATERAL JOINs ?

Oui. Chaque LATERAL peut référencer les colonnes des tables qui le précèdent dans le FROM, y compris celles produites par un LATERAL précédent. Cela dit, plus l'imbrication est profonde, plus la requête devient difficile à lire et à maintenir. Privilégiez les CTEs pour découper la logique.

Le LATERAL JOIN est-il demandé en entretien junior ?

Rarement pour des postes juniors. Il apparaît surtout dans les entretiens pour des postes data analyst senior, data engineer ou ML engineer. Cependant, en connaître la syntaxe de base montre une réelle maîtrise de SQL qui peut faire la différence face à d'autres candidats.

Conclusion

Le LATERAL JOIN est une arme de précision dans l'arsenal SQL : méconnu, mais redoutablement efficace pour le top-N par groupe, les calculs corrélés multi-colonnes et la génération de séries contextuelles. Disponible dans PostgreSQL, MySQL 8+, BigQuery et sous la forme CROSS APPLY dans SQL Server, il couvre la quasi-totalité des environnements data modernes. Prenez le temps de pratiquer les 3 cas d'usage présentés ici, ils reviennent régulièrement en entretien. Pour aller plus loin et tester ces requêtes dans un environnement interactif, rendez-vous sur SQL Pratique où des dizaines d'exercices corrigés vous attendent.

Prêt à vous entraîner ?

50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.

Voir les exercices