LATERAL JOIN vs sous-requête dans PostgreSQL : quand utiliser laquelle ?
Contexte
L'émergence de LATERAL JOIN dans PostgreSQL fournit une solution potentielle aux problèmes complexes de vidage de données impliquant des sous-requêtes inefficaces. Cet article vise à clarifier la situation en explorant les cas d'utilisation et les différences de LATERAL JOIN et des sous-requêtes.
Qu'est-ce que LA JOINTURE LATÉRALE ?
LATERAL JOIN, introduit dans PostgreSQL 9.3, permet à des sous-requêtes ou des fonctions de table d'apparaître dans une clause FROM, leur permettant de référencer des colonnes à partir d'entrées FROM précédentes. Contrairement aux sous-requêtes ordinaires qui ne sont exécutées qu'une seule fois, LATERAL JOIN évalue l'expression du côté droit pour chaque ligne de la jointure gauche, comme une sous-requête corrélée.
versus sous-requête corrélée
LATERAL JOIN est similaire à une sous-requête corrélée, mais présente quelques différences clés. Il convient de noter que LATERAL JOIN peut renvoyer plusieurs colonnes et lignes, tandis que les sous-requêtes corrélées sont généralement limitées à une seule valeur. De plus, dans la syntaxe LATERAL JOIN, l'équivalent d'une sous-requête corrélée est LEFT JOIN LATERAL ... ON true.
Au-delà de la fonctionnalité de sous-requête
LATERAL JOIN fournit des fonctions difficiles à réaliser avec des sous-requêtes. Par exemple, ils permettent l'utilisation de fonctions de table, le référencement croisé de plusieurs entrées FROM et le renvoi de plusieurs colonnes à partir de plusieurs lignes. Ils peuvent également profiter de fonctions qui renvoient des collections pour des opérations plus efficaces.
SELECT renvoie la fonction de collecte dans la liste
Les fonctions de retour de collection comme unnest() peuvent être utilisées directement dans les listes SELECT. Bien qu'auparavant problématique, cela a été optimisé depuis PostgreSQL 10, offrant une alternative à LATERAL JOIN pour renvoyer plusieurs lignes ou colonnes. Cependant, il est important de noter que dans ce cas, les lignes manquantes dans le résultat éliminent la ligne entière, contrairement à LATERAL JOIN.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!