- Kategorien:
ASOF JOIN¶
Eine ASOF JOIN-Operation kombiniert Zeilen aus zwei Tabellen auf der Grundlage von Zeitstempelwerten, die aufeinander folgen, einander vorausgehen oder genau übereinstimmen. Für jede Zeile in der ersten (oder linken) Tabelle findet die Join-Verknüpfung eine einzelne Zeile in der zweiten (oder rechten) Tabelle, die den nächstgelegenen Zeitstempelwert hat. Die passende Zeile auf der rechten Seite ist die mit der besten Übereinstimmung, deren Zeitpunkt gleich, früher oder später liegen kann, je nach dem angegebenen Vergleichsoperator.
Unter diesem Thema wird die Verwendung des ASOF JOIN-Konstrukts in der FROM-Klausel beschrieben. Eine detaillierte Erläuterung des Konzepts von ASOF-Joins finden Sie unter Analysieren von Zeitreihendaten.
Weitere Informationen finden Sie auch unter JOIN, wo die Syntax für andere Standard-Join-Typen wie innere und äußere Joins beschrieben wird.
Syntax¶
Die folgende Syntax der FROM-Klausel ist spezifisch für ASOF JOIN:
Parameter¶
FROMEs wird davon ausgegangen, dass die erste (oder linke) Tabelle in der FROM-Klausel Datensätze enthält, die entweder auf die Datensätze in der zweiten (oder rechten) Tabelle (zeitlich) folgen, ihnen vorausgehen oder genau mit ihnen synchronisiert sind. Wenn es keine Übereinstimmung für eine Zeile in der linken Tabelle gibt, werden die Spalten der rechten Tabelle mit NULL aufgefüllt.
Zusätzlich zu regulären Tabellen und Ansichten kann jede Objektreferenz in einem ASOF JOIN verwendet werden. Siehe FROM.
ASOF JOIN kann in den meisten Kontexten verwendet werden, in denen Verknüpfungen unterstützt werden. Informationen zu einigen Einschränkungen finden Sie unter Nutzungshinweise.
MATCH_CONDITION ( left_table.timecol comparison_operator right_table.timecol )Diese Bedingung nennt die spezifischen Zeitstempelspalten, die in jeder Tabelle verglichen werden sollen.
Die Reihenfolge der Tabellen ist für die Bedingung wichtig. Der Name der linken Tabelle muss zuerst genannt werden.
Die Klammern sind erforderlich.
Der Vergleichsoperator muss einer der folgenden sein:
>=,<=,>,<. Der Gleichheitsoperator (=) wird nicht unterstützt.Die folgenden Datentypen werden unterstützt: DATE, TIME, DATETIME, TIMESTAMP, TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ.
Sie können auch NUMBER-Spalten in der Übereinstimmungsbedingung verwenden. Sie könnten zum Beispiel NUMBER-Spalten haben, die UNIX-Zeitstempel enthalten (die die Anzahl der Sekunden definieren, die seit dem 1. Januar 1970 vergangen sind).
Die Datentypen der beiden übereinstimmenden Spalten müssen nicht genau gleich sein, aber sie müssen kompatibel sein.
ON table.col = table.col [ AND ... ] | USING (column_list)Die optionale ON- oder USING-Klausel definiert eine oder mehrere Gleichheitsbedingungen für Spalten in den beiden Tabellen, um die Ergebnisse der Abfrage logisch zu gruppieren.
Allgemeine Informationen zu ON und USING finden Sie unter JOIN. Beachten Sie, dass bei einer mit USING angegebenen Join-Verknüpfung nur eine der verknüpften Spalten im Resultset mit Zwischenergebnissen projiziert wird, nicht beide. Eine Join-Verknüpfung, die mit einer ON-Klausel angegeben wird, projiziert beide verknüpften Spalten.
Die folgenden Hinweise beziehen sich speziell auf ASOF JOIN:
Der Vergleichsoperator in der ON-Klausel muss das Gleichheitszeichen (=) sein.
Die ON-Klausel kann keine Disjunkte (mit OR verbundene Bedingungen) enthalten. Mit AND verbundene Bedingungen werden unterstützt.
Jede Seite einer Bedingung darf sich nur auf eine der beiden Tabellen im Join beziehen. Die Reihenfolge der Tabellenverweise spielt jedoch keine Rolle.
Jede Bedingung kann in Klammern eingeschlossen werden, aber sie sind nicht erforderlich.
Weitere Informationen dazu finden Sie unter Weitere Details zum Join-Verhalten und Angeben einer USING-Bedingung anstelle einer ON-Bedingung.
Nutzungshinweise¶
Wenn in der rechten Tabelle für eine bestimmte Zeile keine Übereinstimmung gefunden wird, wird das Ergebnis für die ausgewählten Spalten der rechten Tabelle mit NULL aufgefüllt. (ASOF-Joins sind in dieser Hinsicht ähnlich wie linke äußere Verknüpfungen (Left Outer Joins)).
Wenn Sie in der Übereinstimmungsbedingung TIME-Spalten verwenden (im Gegensatz zu einem der Zeitstempeltypen), müssen Sie möglicherweise den Parameter TIME_OUTPUT_FORMAT festlegen, damit Sie beim Anzeigen der ASOF JOIN-Abfrageergebnisse die genauen TIME-Werte sehen, die verglichen werden. Bei der Anzeige einer TIME-Spalte werden standardmäßig Millisekunden abgeschnitten. Siehe TIME-Spalten in der Übereinstimmungsbedingung.
Sie können mehrere ASOF-Joins in derselben Abfrage verwenden, solange alle Syntaxregeln für jeden Join befolgt werden. Auf jeden Join muss unmittelbar eine eigene MATCH_CONDITION-Bedingung folgen. Sie können eine einzelne MATCH_CONDITION-Bedingung nicht auf mehrere ASOF-Joins anwenden. Siehe Mehrere ASOF-Joins in einer Abfrage.
ASOF-Joins werden für Joins mit LATERAL-Tabellenfunktionen oder LATERAL-Inline-Ansichten nicht unterstützt. Weitere Informationen zu seitlichen Verknüpfungen (Lateral Joins) finden Sie unter LATERAL.
Ein ASOF-Join mit einer Selbstreferenz ist in einem RECURSIVE-CTE (Common Table Expression) nicht zulässig. Weitere Informationen zu CTEs finden Sie unter WITH.
Die EXPLAIN-Ausgabe für ASOF JOIN-Abfragen identifiziert die ON- (oder USING-)Bedingungen und die MATCH_CONDITION-Bedingung. Im Text- oder Tabellenformat wird zum Beispiel über den Tabellenscans im Ausführungsplan eine Ausgabe ähnlich dem folgenden Text angezeigt:
In den Query Profiles ist auch die ASOF JOIN-Operation im Ausführungsplan eindeutig gekennzeichnet. In diesem Beispiel können Sie sehen, dass der Tabellenscan 22M Zeilen aus der linken Tabelle liest, die alle durch die Verknüpfung erhalten bleiben. Das Profil zeigt auch die Übereinstimmungsbedingung der Verknüpfung an.
Sie können das ASOF-Schlüsselwort in einer semantischen Ansicht angeben, um die ASOF JOIN-Operation für zwei logische Tabellen in der Ansicht auszuführen. Weitere Informationen dazu finden Sie unter Verwenden eines Datums, einer Uhrzeit, eines Zeitstempels oder eines Zahlenbereichs zum Verknüpfen logischer Tabellen.
Weitere Details zum Join-Verhalten¶
Die optionalen ON- (oder USING-)Bedingungen für ASOF JOIN bieten eine Möglichkeit, Tabellenzeilen zu gruppieren oder zu partitionieren, bevor die endgültigen übereinstimmenden Zeilen durch die erforderliche Übereinstimmungsbedingung herausgefiltert werden. Wenn Sie möchten, dass die Zeilen aus den verknüpften Tabellen nach einer oder mehreren Dimensionen gruppiert werden, die die Tabellen gemeinsam haben (Aktiensymbol, Standort, Stadt, Bundesland, Firmenname usw.), verwenden Sie eine ON-Bedingung. Wenn Sie keine ON-Bedingung verwenden, kann jede Zeile aus der linken Tabelle mit jeder Zeile aus der rechten Tabelle im endgültigen Resultset (zeitlich) abgeglichen werden.
Im folgenden Beispiel haben die Tabellen left_table und right_table die Werte A, B usw. in Spalte c1 und die Werte 1, 2 usw. in Spalte c2. Spalte c3 ist eine TIME-Spalte, und c4 ist ein numerischer Wert (diese Spalte ist von Interesse).
Erstellen und laden Sie zuerst die beiden Tabellen:
Wenn c1 und c2 Spalten einer ON-Bedingung in der Abfrage sind, stimmt eine Zeile in der linken Tabelle nur mit einer Zeile in der rechten Tabelle überein, wenn A und 1, A und 2, B und 1 oder B und 2 in beiden Tabellen gefunden werden. Wenn für solche Werte keine Übereinstimmung gefunden wird, werden die rechten Tabellenspalten mit NULL aufgefüllt.
Wenn die ON-Bedingungen entfernt werden, kann jede Kombination von Werten in c1 und c2 im Endergebnis übereinstimmen. Nur die Übereinstimmungsbedingung bestimmt die Ergebnisse.
Erwartetes Verhalten, wenn in der rechten Tabelle „Verbindungen“ vorliegen¶
ASOF JOIN-Abfragen versuchen immer, für eine einzelne Zeile in der linken Tabelle eine Übereinstimmung mit einer einzelnen Zeile in der rechten Tabelle zu finden. Dieses Verhalten gilt auch dann, wenn zwei (oder mehr) Zeilen in der rechten Tabelle identisch sind und für die Verknüpfung in Frage kommen. Wenn solche Verbindungen bestehen und Sie dieselbe Join-Abfrage mehrfach ausführen, erhalten Sie möglicherweise unterschiedliche Ergebnisse. Die Ergebnisse sind nicht deterministisch, da jede der zusammenfassenden Zeilen zurückgegeben werden kann. Wenn Sie sich bei den Ergebnissen von ASOF JOIN-Abfragen nicht sicher sind, dann suchen Sie für Zeilen in der rechten Tabelle nach exakten Übereinstimmungen in den Zeitstempelwerten.
Fügen Sie beispielsweise unter Verwendung derselben Tabellen aus den Beispielen im vorherigen Abschnitt eine Spalte right_id zu right_table hinzu, und fügen Sie die folgenden Zeilen ein:
Zwei der Zeilen sind bis auf ihre right_id-Werte identisch. Führen Sie nun die folgende ASOF JOIN-Abfrage aus:
Beachten Sie, dass die Zeilen A1 und A2 aus right_table beide für die Verknüpfung in Frage kommen, aber nur A2 zurückgegeben wird. Bei einer späteren Ausführung derselben Abfrage könnte stattdessen A1 zurückgegeben werden.
Umschreiben von ASOF JOIN-Abfragen, um Scans der rechten Tabelle zu reduzieren¶
Wenn die Kardinalität der ON- oder USING-Join-Spalte in der linken Tabelle kleiner ist als die Kardinalität der Join-Spalte in der rechten Tabelle, führt der Optimierer kein Pruning der nicht übereinstimmenden Zeilen aus der rechten Tabelle durch. Daher werden mehr Zeilen aus der rechten Tabelle gescannt, als für die Verknüpfung benötigt werden. Dieses Verhalten tritt typischerweise auf, wenn die Abfrage einen hochselektiven Filter auf eine Nicht-Join-Spalte der linken Tabelle enthält und der Filter die Kardinalität der Join-Spalte reduziert.
Sie können dieses Problem umgehen, indem Sie die Zeilen, die für die Verknüpfung in Frage kommen, manuell reduzieren. Beispielsweise hat die ursprüngliche Abfrage das folgende Muster, und t1.c1 hat eine geringere Kardinalität als t2.c1:
Sie können die Abfrage wie folgt umschreiben, um manuell die Zeilen aus t2 auszuwählen, in denen t2.c1-Werte in t1.c1 gefunden werden:
Verwenden von ASOF und MATCH_CONDITION als Objekt- und Aliasnamen¶
Die Verwendung der Schlüsselwörter ASOF und MATCH_CONDITION in der SELECT-Befehlssyntax ist eingeschränkt:
Wenn eine SELECT-Anweisung ASOF oder MATCH_CONDITION als Name einer Tabelle, einer Ansicht oder einer Inline-Ansicht verwendet, ist folgende Identifizierung erforderlich:
Wenn das Objekt mit doppelten Anführungszeichen im Namen erstellt wurde, verwenden Sie denselben Namen in doppelten Anführungszeichen.
Wenn das Objekt ohne Anführungszeichen im Namen erstellt wurde, verwenden Sie doppelte Anführungszeichen und Großbuchstaben.
Die folgenden Anweisungen sind zum Beispiel nicht mehr zulässig und geben Fehler zurück:
Wenn Sie die Objekte mit doppelten Anführungszeichen erstellt haben, beheben Sie das Problem, indem Sie doppelte Anführungszeichen verwenden:
Wenn Sie die Objekte ohne doppelte Anführungszeichen erstellt haben, beheben Sie das Problem, indem Sie doppelte Anführungszeichen und Großbuchstaben verwenden:
Siehe auch Bezeichner ohne Anführungszeichen.
Wenn eine SELECT-Anweisung ASOF oder MATCH_CONDITION als Alias verwendet, müssen Sie AS vor dem Alias verwenden oder den Alias in doppelte Anführungszeichen setzen. Die folgenden Anweisungen sind zum Beispiel nicht mehr zulässig und geben Fehler zurück:
Zur Behebung des Problems gibt es folgende Optionen:
Beispiele¶
Die folgenden Beispiele zeigen das erwartete Verhalten von ASOF JOIN-Abfragen. Führen Sie zunächst die Abfrage unter Verknüpfen zweier Tabellen anhand der engsten Übereinstimmung (Alignment) aus, und fahren Sie dann mit den Beispielen hier fort.
Mit NULL aufgefüllte Ergebnisse¶
Fügen Sie eine neue Zeile in die Tabelle trades mit einem Datum ein, das einen Tag vor dem Datum der vorhandenen Zeilen in trades und quotes liegt:
Führen Sie nun die erste Beispielabfrage erneut aus. Beachten Sie, dass die Abfrage vier Zeilen zurückgibt, aber die neue Zeile mit NULL aufgefüllt ist. Es gibt keine Zeile in der Tabelle quotes, auf die die Übereinstimmungsbedingung zutrifft. Die Spalten von trades werden zurückgegeben, und die entsprechenden Spalten von quotes werden mit NULL aufgefüllt.
Verwenden eines anderen Vergleichsoperators in der Übereinstimmungsbedingung¶
In Weiterführung des vorherigen Beispiels ändern sich die Ergebnisse der Abfrage erneut, wenn der Vergleichsoperator in der Übereinstimmungsbedingung geändert wird. In der folgenden Abfrage wird der Operator <= (anstelle von >=) angegeben:
Siehe auch Vergleichsoperatoren „Kleiner als“ und „Größer als“.
Angeben einer USING-Bedingung anstelle einer ON-Bedingung¶
Sie können in ASOF JOIN-Abfragen eine ON-Bedingung oder eine USING-Bedingung verwenden. Die folgende Abfrage entspricht der vorherigen Abfrage, nur dass ON durch USING ersetzt wird. Die Syntax USING(stock_symbol) impliziert die Bedingung t.stock_symbol=q.stock_symbol.
Innere Verknüpfung (Inner Join) mit einer dritten Tabelle¶
Im folgenden Beispiel wird dem Join eine dritte Tabelle companies hinzugefügt, um den Firmennamen für jedes Aktiensymbol auszuwählen. Sie können einen reguläre INNER JOIN-Ausdruck mit einer ON-Bedingung (oder eine andere Standard-Join-Syntax) verwenden, um die dritte Tabelle hinzuzufügen. Beachten Sie jedoch, dass USING(stock_symbol) hier nicht funktionieren würde, da der Verweis auf stock_symbol mehrdeutig wäre.
Zahlen als Zeitstempel¶
Das folgende Beispiel zeigt, dass die Übereinstimmungsbedingung numerische Werte vergleichen kann. In diesem Fall weisen die Tabellen NUMBER(38,0)-Spalten auf, in denen UNIX-Zeitstempelwerte gespeichert sind. 1696150805 ist äquivalent zu 2023-10-30 10:20:05.000 (drei Sekunden später als 1696150802).
TIME-Spalten in der Übereinstimmungsbedingung¶
In den folgenden Beispielen werden zwei Tabellen verknüpft, die Wetterbeobachtungen enthalten. Die Beobachtungen in diesen Tabellen werden in TIME-Spalten erfasst. Sie können die Tabellen wie folgt erstellen und laden:
Wenn Sie die erste Abfrage ausführen, scheinen einige der TIME-Werte im Resultset genau gleich zu sein (14:42:59, 14:42:44).
Um eine genauere Anzeige der TIME-Werte, einschließlich Millisekunden, zu erhalten, führen Sie den folgenden ALTER SESSION-Befehl aus, und führen Sie dann die ASOF JOIN-Abfrage erneut aus:
Mehrere ASOF-Joins in einer Abfrage¶
Das folgende Beispiel zeigt, wie eine Sequenz von zwei oder mehr ASOF-Joins in einem einzigen Abfrageblock verbunden wird. Die drei Tabellen (snowtime, raintime, preciptime) enthalten alle Wetterbeobachtungen, die an bestimmten Orten zu bestimmten Zeiten aufgezeichnet wurden. Die Spalte von Interesse ist die Spalte observation. Die Zeilen sind logisch nach Bundesstaat gruppiert.
Vergleichsoperatoren „Kleiner als“ und „Größer als“¶
In Anlehnung an das vorherige Beispiel werden zwei ASOF-Joins angegeben, aber diesmal wird für die erste Übereinstimmungsbedingung der Operator > und für die zweite der Operator < verwendet. Das Ergebnis besteht aus genau einer Zeile, die Daten aus allen drei Tabellen liefert, und drei Zeilen, die Daten aus zwei der Tabellen liefern. Viele der Spalten im Resultset sind mit NULL aufgefüllt.
Logischerweise findet die Abfrage nur eine Zeile, in der die beobachtete Zeit aus der Tabelle snowtime nach der beobachteten Zeit aus der Tabelle raintime, aber vor der beobachteten Zeit aus der Tabelle preciptime lag.
Beispiele für erwartete Fehlerfälle¶
Die folgenden Beispiele zeigen Abfragen, die erwartete Syntaxfehler zurückgeben.
Wenn Sie deklariert haben, dass snowtime s die linke Tabelle ist, können Sie die Übereinstimmungsbedingung nicht mit einem Verweis auf die rechte Tabelle preciptime p beginnen:
In Übereinstimmungsbedingungen sind nur die Operatoren >=, <=, > und < erlaubt:
Die ON-Klausel für ASOF JOIN muss Gleichheitsbedingungen enthalten:
Eine Gleichheitsbedingung einer ON-Klausel kann keine Disjunktionen enthalten:
ASOF-Joins können nicht mit LATERAL-Inline-Ansichten verwendet werden: