JOIN (Azure Stream Analytics)

Wie standard T-SQL werden JOIN in der Azure Stream Analytics-Abfragesprache verwendet, um Datensätze aus zwei oder mehr Eingabequellen zu kombinieren. JOIN in Azure Stream Analytics ist zeitlicher Natur, was bedeutet, dass jeder JOIN einige Grenzwerte für die Zeitliche Trennung der übereinstimmenden Zeilen bereitstellen muss. Für instance "TollBoothEntry-Ereignisse mit TollBoothExit-Ereignissen beitreten, wenn sie auf demselben LicensePlate und TollId auftreten und innerhalb von 5 Minuten voneinander" ist legitim. "TollBoothEntry-Ereignisse mit TollBoothExit-Ereignissen verknüpfen, wenn sie auf der LicensePlate und TollId auftreten" ist nicht – es würde jedem TollBoothEntry eine ungebundene und potenziell unendliche Sammlung aller TollBoothExit-Ereignisse mit derselben LicensePlate und Derselben TollId entsprechen.

Die Zeitgrenzen für die Beziehung werden in der ON-Klausel der JOIN-Funktion mithilfe der FUNKTION DATEDIFF angegeben. Die maximale DATIFF-Größe beträgt sieben Tage. Weitere Informationen zur allgemeinen Verwendung finden Sie unter DATEDIFF (Azure Stream Analytics). Wenn DATEDIFF innerhalb der JOIN-Bedingung verwendet wird, erfordern der zweite und dritte Parameter eine besondere Behandlung.

Darüber hinaus kann SELECT * nicht in JOIN-Anweisungen verwendet werden.

Syntax

[ FROM { <input_source> } [ ,...n ] ]  
<input_source> ::=   
{  
    input_name [ [ AS ] input_alias ]   
    | <joined_table>   
}  
  
<joined_table> ::=   
{  
    <input_source> <join_type> <input_source> ON <join_condition>   
    | [ <input_source> <join_type> <reference_data> ON <join_condition> ]  
    | [ ( ] <joined_table> [ ) ]   
}  
<join_type> ::=   
    [ { INNER | LEFT [ OUTER ] } ] JOIN  
  

Argumente

<input_source>

Gibt die Quelle der Eingabedaten an.

<reference_data>

Die Verweisdaten, mit denen Sie Ihre Eingabequelle (input_source) verknüpfen möchten. Weitere Informationen finden Sie im Abschnitt "Verweisdatenverknüpfung".

<join_type>

Gibt den Typ der Joinoperation an.

JOIN

Gibt an, dass die angegebene JOIN-Operation zwischen den angegebenen Eingabequellen und/oder Verweisdaten erfolgen soll. Alle Zeilen aus der linken und rechten Tabelle, die die JOIN-Bedingung erfüllen, werden im Resultset berücksichtigt.

Warnung

Wenn die JOIN-Quellen partitioniert sind, muss das JOIN-Prädikat eine Bedingung enthalten, die den Partitionsschlüsseln beider Quellen entspricht.

[ LINKER ÄUßERER JOIN ]

Gibt an, dass alle Zeilen der linken Tabelle, die die angegebene Joinbedingung nicht erfüllen, im Resultset enthalten sind. Die Ausgabespalten der anderen Tabelle werden auf NULL gesetzt. Dies erfolgt zusätzlich zu allen Zeilen, die von INNER JOIN zurückgegeben werden.

ON <join_condition>

Gibt die Bedingung an, auf der der Join basiert. Die Joinbedingung muss über einen zeitgebundenen oder einen temporalen Wackelraum verfügen, der für die Beziehung definiert ist und in der ON-Klausel der JOIN-Klausel angegeben wird, wobei die spezielle Syntax der Special DATEDIFF Function for JOIN-Funktionverwendet wird.

Beispiele

In Azure Stream Analytics sind alle Ereignisse mit einem klar definierten Zeitstempel gekennzeichnet. Daher muss der Benutzer Zeilenalias direkt in der FUNKTION DATEDIFF wie folgt verwenden:

SELECT I1.TollId, I1.EntryTime,I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationInMinutes   
FROM Input1 I1 TIMESTAMP BY EntryTime   
JOIN Input2 I2 TIMESTAMP BY ExitTime  
ON DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15  
  

Die obige JOIN-Bedingung führt nur dann zu einer Übereinstimmung, wenn die ExitTime nach der EntryTime auftritt, wobei der zeitliche Abstand nicht mehr als 15 Minuten betragen darf.

Hinweis

DATEDIFF, die in der SELECT-Anweisung verwendet wird, verwendet die allgemeine Syntax, bei der eine datetime-Spalte oder ein Ausdruck als zweiter und dritter Parameter übergeben wird. Wenn die DATIFF-Funktion jedoch innerhalb der JOIN-Bedingung verwendet wird, wird der input_source Name oder sein Alias verwendet. Intern wird der für jedes Ereignis in dieser Quelle zugeordnete Zeitstempel ausgewählt.

Zeitgebundene Bedingungen können miteinander und mit anderen Bedingungen in der ON-Klausel kombiniert werden. Beispiel:

SELECT I1.TollId, I1.EntryTime, I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationinMinutes   
FROM Input1 I1 TIMESTAMP BY EntryTime   
JOIN Input2 I2 TIMESTAMP BY ExitTime  
ON I1.TollId=I2.TollId  
AND I1.LicensePlate=I2.LicensePlate  
AND DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15  
  

Beim Verknüpfen von drei oder mehr Tabellen gelten dieselben Regeln, --- Zeitgrenzen sicherstellen müssen, dass alle übereinstimmend auftretenden Ereignisse innerhalb einer endlichen Zeitspanne voneinander auftreten. Für instance kann man sagen, um alle Fehler zu finden, die zwischen Transaktionsstart und Transaktionsendereignis aufgetreten sind:

SELECT TS.Id, TS.Name, TS.Amount, E.ErrorCode, E.Description   
FROM TStart TS TIMESTAMP BY TStartTime   
JOIN TEnd TE TIMESTAMP BY TEndTime  
ON DATEDIFF(second, TS, TE) BETWEEEN 0 AND 5  
AND TS.Id = TE.Id  
JOIN Error E TIMESTAMP BY ErrorTime  
ON DATEDIFF(second, TS, E) BETWEEN 0 AND 5
AND DATEDIFF(second, TE, E) < 0
AND E.TId = TS.Id  
  

Beim Verknüpfen von partitionierten Quellen muss das JOIN-Prädikat eine Bedingung enthalten, die den Partitionsschlüsseln beider Quellen entspricht.

SELECT I1.TollId, I1.EntryTime,I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationInMinutes   
FROM Input1 I1 TIMESTAMP BY EntryTime PARTITION BY PartitionId  
JOIN Input2 I2 TIMESTAMP BY ExitTime PARTITION BY PartitionId  
ON I1.PartitionId = I2.PartitionId AND DATEDIFF(minute,I1,I2) BETWEEN 0 AND 15  

Schließlich unterstützt Azure Stream Analytics sowohl inneren Join (Standard) als auch LEFT outer join. Für eine innere Verknüpfung wird nur dann ein Ergebnis zurückgegeben, wenn eine Übereinstimmung gefunden wird. Wenn jedoch ein Ereignis von der linken Seite der Verknüpfung keine Übereinstimmung besitzt, wird bei LEFT OUTER JOIN für alle Spalten der rechten Zeile eine Zeile mit NULL zurückgegeben. Für instance finden Sie hier ein Beispiel, um das Fehlen von Ereignissen zu ermitteln. In der folgenden Abfrage werden die Zeilen zurückgegeben, in denen ein Fahrzeug eine Mautstelle angefahren, diese jedoch nicht innerhalb von 15 Minuten verlassen hat.

SELECT I1.TollId, I1.EntryTime, I2.ExitTime, I1.LicensePlate, DATEDIFF(minute,I1.EntryTime,I2.ExitTime) AS DurationinMinutes   
FROM Input1 I1 TIMESTAMP BY EntryTime   
LEFT OUTER JOIN Input2 I2 TIMESTAMP BY ExitTime  
ON I1.TollId=I2.TollId  
AND I1.LicensePlate=I2.LicensePlate  
AND DATEDIFF( minute , I1 , I2 ) BETWEEN 0 AND 15   
WHERE I2.TollId IS NULL  
  

Spezielle DATEDIFF-Funktion für JOIN

Syntax

DATEDIFF ( datepart , input_source1, input_source2 )  

Argumente

dateparts

Beispiel: "second", "millisecond", "minute" usw.)

input_source1

Die erste Eingabequelle in der Verknüpfung. Der den Ereignissen dieser Eingabequelle (input_source) zugeordnete Zeitstempel wird intern an die Funktion übergeben.

input_source2

Die zweite Eingabequelle in der Verknüpfung. Der den Ereignissen dieser Eingabequelle (input_source) zugeordnete Zeitstempel wird intern an die Funktion übergeben.

Rückgabetyp

Gibt die Anzahl der Einheiten in DateParts zurück, die zwischen dem Zeitstempel der ersten Eingabequelle (input_source1) bis zum Zeitstempel der zweiten Eingabequelle (input_source2) verstrichen sind. Der zurückgegebene Wert kann negativ sein, wenn der Zeitstempel der zweiten input_source größer als der erste ist.