web-dev-qa-db-fra.com

REJOINDRE (CHOISIR ...) ue ON 1 = 1?

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?

19
kee

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".

8
Buddy Yaussy

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
25
Erwin Brandstetter

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

4
Sethu Sabarish