Je lis une requête SQL dans Redshift et je ne comprends pas la dernière partie:
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
Qu'est-ce que ON 1=1
veux dire ici?
Il s'agit simplement d'une jointure croisée, qui sélectionne toutes les lignes de la première table et toutes les lignes de la deuxième table et s'affiche comme produit cartésien, c'est-à-dire avec toutes les possibilités.
Les instructions JOIN (LEFT, INNER, RIGHT, etc.) nécessitent normalement une condition "ON ...". Mettre 1 = 1 revient à dire "1 = 1 est toujours vrai, n'élimine rien".
L'intention est un inconditionnelLEFT JOIN
, Qui est différent à partir d'un CROSS JOIN
en ce que toutes les lignes de l'expression de table de gauche sont renvoyées, même s'il n'y a pas de correspondance dans l'expression de table de droite - tandis qu'un CROSS JOIN
supprime ces lignes du résultat. Plus d'informations sur les jointures dans le manuel.
Toutefois:
1=1
Est inutile dans Postgres et tous les dérivés y compris Amazon Redshift. Utilisez simplement true
. Cela a probablement été reporté d'un autre SGBDR qui ne prend pas correctement en charge le type boolean
.
... LEFT JOIN (SELECT ...) ue ON true
Là encore, LEFT JOIN
Est inutile pour cette sous-requête particulière avec SELECT MIN(modified) FROM user
à droite, car un SELECT
avec une fonction d'agrégation (min()
) et non La clause GROUP BY
Renvoie toujours exactement une ligne. Ce cas (mais pas les autres cas où pas de ligne pourrait être trouvé) peut être simplifié pour:
... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
Je crois que son utilisé pour émuler la jointure cartésienne.
À partir de votre requête, la valeur la moins modifiée (Ce sera juste 1 élément) sera affectée à tous les enregistrements du tableau de gauche.
PS : La jointure gauche n'est pas très utile ici. Autant utiliser la jointure interne