it-swarm.com.de

JOIN (SELECT ...) ue ON 1 = 1?

Ich lese eine SQL-Abfrage in Redshift und kann den letzten Teil nicht verstehen:

...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1

Was macht ON 1=1 meine hier?

19
kee

Es wird einfach ein Cross-Join ausgeführt, bei dem alle Zeilen aus der ersten Tabelle und alle Zeilen aus der zweiten Tabelle ausgewählt und als kartesisches Produkt angezeigt werden, d. H. Mit allen Möglichkeiten.

Für JOIN-Anweisungen (LEFT, INNER, RIGHT usw.) ist normalerweise die Bedingung "ON ..." erforderlich. Wenn Sie 1 = 1 eingeben, bedeutet dies, dass "1 = 1 ist immer wahr, eliminieren Sie nichts".

8
Buddy Yaussy

Die Absicht ist ein unbedingtLEFT JOIN, Das ist anders aus einem CROSS JOIN, indem alle Zeilen des linken Tabellenausdrucks zurückgegeben werden, auch wenn der rechte Tabellenausdruck keine Übereinstimmung aufweist - während ein CROSS JOIN solche Zeilen aus dem Ergebnis löscht. Mehr zu Joins im Handbuch.

Jedoch:

1=1 Ist sinnlos in Postgres und alle Ableitungen einschließlich Amazon Redshift. Verwenden Sie einfach true. Dies wurde wahrscheinlich von einem anderen RDBMS übernommen, das den Typ boolean nicht ordnungsgemäß unterstützt.

... LEFT JOIN (SELECT  ...) ue ON true

Andererseits ist LEFT JOIN Für diese spezielle Unterabfrage mit SELECT MIN(modified) FROM user auf der rechten Seite sinnlos, da ein SELECT mit einer Aggregatfunktion (min()) und nein Die GROUP BY - Klausel gibt immer genau eine Zeile zurück. Dieser Fall (aber nicht andere Fälle, in denen keine Zeile gefunden werden kann) kann vereinfacht werden zu:

... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
25

Ich glaube, es wird verwendet, um kartesische Verknüpfungen zu emulieren.

Aus Ihrer Abfrage wird allen Datensätzen der linken Tabelle der am wenigsten veränderte Wert (es wird nur 1 Element sein) zugewiesen.

PS : Linke Verknüpfung ist hier nicht sehr nützlich. Könnte auch nur innere Verbindung verwenden

4
Sethu Sabarish