共用方式為


加入

✅ Azure 串流分析 ✅ 網狀架構事件串流

如同標準 T-SQL,Azure 串流分析查詢語言中的 JOIN 可用來合併來自兩個或多個輸入來源的記錄。 Azure 串流分析中的 JOIN 本質上是暫時性的,這表示每個 JOIN 必須提供一些限制,以時間分隔相符的數據列。 例如,在相同的 LicensePlate 和 TollId 上發生 TollBoothEntry 事件,並在彼此 5 分鐘內加入 TollBoothEntry 事件是合法的:但是「在 LicensePlate 和 TollId 上發生 TollBoothExit 事件時聯結 TollBoothEntry 事件」不是 –它會比對每個 TollBoothEntry 與所有 TollBoothExit 的未系結且可能無限集合到相同的 LicensePlate 和 TollId。

關聯性的時間界限是在 JOIN 的 ON 子句內,使用 DATEDIFF 函式來指定。 DATEDIFF 大小上限為七天。 如需其一般用途的詳細資訊,請參閱 DATEDIFF。 在 JOIN 條件內使用 DATEDIFF 時,第二個和第三個參數會獲得特殊處理。

此外,SELECT * 不能用在 JOIN 語句中。

語法

[ 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  
  

論點

<input_source>

指定輸入數據源。

<reference_data>

您要加入input_source的參考數據。 如需詳細資訊,請參閱參考數據聯結一節。

<join_type>

指定聯結動作的類型。

加入

表示指定的聯結作業應該發生在指定的輸入來源和 /或參考數據之間。 符合聯結條件的左右所有數據列都會包含在結果集中。

警告

如果已分割 JOIN 來源,JOIN 述詞必須包含符合這兩個來源的數據分割索引鍵的條件。

[ 左外連接 ]

指定左資料表中不符合聯結條件的所有資料列必須併入結果集中,而且,除了內部聯結所傳回的所有資料列以外,還必須將其他資料表中的輸出資料行設為 NULL。

在join_condition上<>

指定聯結所根據的條件。 聯結條件必須具有為關聯性定義的時間界限或時態性擺動空間,而且是在 JOIN 的 ON 子句內指定,使用 JOIN 函式 的特殊語法

範例

在 Azure 串流分析中,所有事件都有妥善定義的時間戳。 因此,用戶必須在 DATEDIFF 函式中直接使用數據列別名,如下所示:

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  
  

如果 ExitTime 發生在 EntryTime 之後,但不超過 15 分鐘之後,上述聯結條件才會產生相符專案。

備註

SELECT 語句中使用的 DATEDIFF 會使用一般語法,其中 datetime 數據行或表示式會當做第二個和第三個參數傳入。 不過,在 JOIN 條件內使用 DATEDIFF 函式時,會使用input_source名稱或其別名。 在該來源中每個事件相關聯的時間戳會在內部進行挑選。

時間系結條件可以彼此結合,以及 ON 子句內的其他條件,例如:

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  
  

聯結三個或多個數據表時,相同的規則會套用---時間範圍,必須確保所有相符的事件都會在彼此的有限時間內發生。 例如,若要尋找交易開始與交易結束事件之間發生的所有錯誤,可以說:

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  
  

聯結已分割的來源時,JOIN 述詞必須包含符合這兩個來源之數據分割索引鍵的條件。

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  

最後,Azure 串流分析同時支援內部聯結(預設值)和 LEFT 外部聯結。 針對內部聯結,只有在找到相符專案時,才會傳回結果。 但是對於 LEFT OUTER 聯結而言,如果聯結左邊的事件不相符,則會傳回右列所有數據行的 NULL 數據列。 例如,以下是尋找缺少事件的範例。 下列查詢會傳回車輛已進入收費亭但未在 15 分鐘內結束布斯的數據列。

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  
  

JOIN 的特殊 DATEDIFF 函數

語法

DATEDIFF ( datepart , input_source1, input_source2 )  

論點

dateparts

例。 'second'、'millisecond'、'minute'等)

input_source1

Join 中的第一個輸入來源。 在這個input_source事件的相關時間戳內部會傳遞至 函式。

input_source2

Join 中的第二個輸入來源。 在這個input_source事件的相關時間戳內部會傳遞至 函式。

傳回值

傳回從 input_source1 的時間戳記到 input_source2 時間戳記的指定日期部分界限的計數 (以帶正負號整數形式)。 如果 input_source1 的時間戳記大於 input_source2 的時間戳記,則傳回值可以為負數。