JOIN (Analisi di flusso di Azure)

Analogamente a T-SQL standard, join nel linguaggio di query di Analisi di flusso di Azure viene usato per combinare i record di due o più origini di input. JOIN in Analisi di flusso di Azure è di natura temporale, ovvero ogni JOIN deve fornire alcuni limiti sulla distanza di separazione delle righe corrispondenti nel tempo. Ad esempio, dicendo che "partecipa agli eventi TollBoothEntry con gli eventi TollBoothExit quando si verificano sullo stesso LicensePlate e TollId e entro 5 minuti l'uno dall'altro" è legittimo; ma "join TollBoothEntry events with TollBoothExit events when they occur on the LicensePlate and TollId" is not – it would match each TollBoothEntry with an unbounded and potenzialmente infinite collection of all TollBoothExit to the same LicensePlate and TollId.

I limiti di tempo per la relazione vengono specificati all'interno della clausola ON di JOIN, utilizzando la funzione DATEDIFF. Le dimensioni massime di DATEDIFF sono sette giorni. Per altre informazioni sull'uso generale, vedere DATEDIFF (Analisi di flusso di Azure).For more information on its general use, see DATEDIFF (Azure Stream Analytics). Quando la funzione DATEDIFF viene usata all'interno della condizione JOIN, il secondo e il terzo parametro ottengono un trattamento speciale.

Inoltre, non è possibile usare SELECT * nelle istruzioni JOIN.

Sintassi

[ 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  
  

Argomenti

<input_source>

Specifica l'origine dei dati di input.

<reference_data>

I dati di riferimento a cui si vuole unire l'argomento input_source. Per altre informazioni, vedere la sezione Join dei dati di riferimento.

<join_type>

Specifica il tipo di operazione di join.

JOIN

Indica che l'operazione di join specificata dovrà avvenire tra le origini di input specificate e/o i dati di riferimento. Tutte le righe da sinistra a destra che soddisfano la condizione di join vengono incluse nel set di risultati.

Avviso

Se le origini JOIN sono partizionate, il predicato JOIN deve includere una condizione corrispondente alle chiavi di partizione di entrambe le origini.

[ LEFT OUTER JOIN ]

Specifica che, oltre alle righe restituite dall'inner join, vengono incluse nel set di risultati tutte le righe della tabella sinistra che non rispettano la condizione di join e le colonne di output dell'altra tabella sono impostate su NULL.

ON <join_condition>

Specifica la condizione su cui è basato il join. La condizione di join deve avere un limite di tempo o una stanza temporale definita per la relazione e viene specificata all'interno della clausola ON di JOIN, utilizzando la sintassi speciale della funzione SPECIAL DATEDIFF per la funzione JOIN.

Esempio

In Analisi di flusso di Azure tutti gli eventi hanno un timestamp ben definito. Di conseguenza, l'utente deve usare alias di riga direttamente nella funzione DATEDIFF, come indicato di seguito:

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  
  

La condizione join sopra riportata risulterà corrispondente se e solo se l'ora in ExitTime è successiva all'ora in EntryTime, ma non oltre 15 minuti dopo.

Nota

DATEDIFF usato nell'istruzione SELECT usa la sintassi generale in cui una colonna o un'espressione datetime viene passata come secondo e terzo parametro. Tuttavia, quando la funzione DATEDIFF viene usata all'interno della condizione JOIN, viene usato il nome input_source o il relativo alias. Internamente, viene scelto il timestamp associato a ogni evento in tale origine.

È possibile combinare le condizioni con limite di tempo reciprocamente e con altre condizioni all'interno della clausola ON, ad esempio:

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  
  

Quando si unisce tre o più tabelle, le stesse regole si applicano --- limiti di tempo devono garantire che tutti gli eventi corrispondenti si verifichino entro un periodo di tempo finito l'uno dall'altro. Ad esempio, per trovare tutti gli errori che si sono verificati tra l'evento di inizio della transazione e l'evento finale della transazione, è possibile pronunciare:

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  
  

Quando si uniscono origini partizionate, il predicato JOIN deve includere una condizione corrispondente alle chiavi di partizione di entrambe le origini.

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  

Analisi di flusso di Azure supporta infine sia inner join (impostazione predefinita) che LEFT outer join. Per un inner join, viene restituito un risultato solo quando viene trovata una corrispondenza. Invece, per un LEFT OUTER JOIN , se un evento dal lato sinistro del join è senza corrispondenza, viene restituita una riga con valore NULL per tutte le colonne della riga destra. Ad esempio, ecco un esempio per trovare l'assenza di eventi. La query seguente restituirà le righe in cui un veicolo è entrato in un casello, ma non ne è uscito entro 15 minuti.

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  
  

Funzione DATEDIFF speciale per JOIN

Sintassi

DATEDIFF ( datepart , input_source1, input_source2 )  

Argomenti

dateparts

Esempio. 'second', 'millisecond', 'minute' e così via)

input_source1

La prima origine di input nel Join. Internamente il timestamp associato agli eventi da questa input_source viene passato alla funzione.

input_source2

La seconda origine di input nel Join. Internamente il timestamp associato agli eventi da questa input_source viene passato alla funzione.

Tipo restituito

Restituisce il numero di unità in datepart che è trascorso dal timestamp di input_source1 al timestamp di input_source2. Il valore restituito può essere negativo se il timestamp del secondo input_source è maggiore del primo.