JOIN句を使用すると、複数の文または指定した状態、あるいはその両方からのレコードを、その文の特定の属性間の関係に基づいて結合できます。
JOIN句(SQL標準のサブセットに従っている)は、指定された結合条件で結合を実行します。結合条件は、FROM文の属性を参照する任意のブール式として指定できます。式はカッコで囲まれている必要があります。
JOIN句は常に、FROM句に修正を加えます。2つの指定したソース(1つまたは両方が指定した状態である)をFROM句の中で指定できます。フィールドは、どのソースからのものかを示すようにドット修飾されている必要があります。ただし、単一表からの問合せを除きます。
自己結合がサポートされます。自己結合には、文の別名が必要です。
入力表は両方とも、DEFINE文またはRETURN文の結果(つまり、中間結果)であることが必要です。
任意の数の結合を1つの文で実行できます。
FROM <statement1> [alias] [INNER,CROSS,LEFT,RIGHT,FULL] JOIN <statement2> [alias] ON (Boolean-expression) [JOIN <statementN> [alias] ON (Boolean-expression)]*ここで、statementは、1つの文または1つの指定した状態です。1つのFROM句に対して複数のJOIN句を指定できますが、任意の文に使用するFROM句は1つのみである必要があります。
EQLでは、次の結合タイプがサポートされます。
正しく使用されていない場合は、結合が原因で、Dgraphが使用可能なRAMより大きくなることがあることに注意してください。これは、結合の結果が非常に大きくなることがあるためです。たとえば、100レコードの結果と200レコードの結果のCROSS JOINによって、20,000レコードが生成されます。2つのベスト・プラクティスがあります。1つは、可能であればCROSS JOINの使用を避けることで、もう1つはON条件について、妥当な数の結果になるように注意することです。
DEFINE EmployeeTotals AS SELECT ARB(DimEmployee_FullName) AS Name, SUM(FactSales_SalesAmount) AS Total FROM SaleState GROUP BY DimEmployee_EmployeeKey, ProductSubcategoryName; DEFINE SubcategoryTotals AS SELECT SUM(FactSales_SalesAmount) AS Total FROM SaleState GROUP BY ProductSubcategoryName; RETURN Stars AS SELECT EmployeeTotals.Name AS Name, EmployeeTotals.ProductSubcategoryName AS Subcategory, 100 * EmployeeTotals.Total / SubcategoryTotals.Total AS Pct FROM EmployeeTotals INNER JOIN SubcategoryTotals ON (EmployeeTotals.ProductSubcategoryName = SubcategoryTotals.ProductSubcategoryName) HAVING Pct > 10
DEFINE Days AS SELECT FactSales_OrderDateKey AS DateKey, DimEmployee_EmployeeKey AS EmployeeKey, ARB(DimEmployee_FullName) AS EmployeeName, SUM(FactSales_SalesAmount) AS DailyTotal FROM SaleState GROUP BY DateKey, EmployeeKey; RETURN CumulativeDays AS SELECT SUM(PreviousDays.DailyTotal) AS CumulativeTotal, Day.DateKey AS DateKey, Day.EmployeeKey AS EmployeeKey, ARB(Day.EmployeeName) AS EmployeeName FROM Days Day JOIN Days PreviousDays ON (PreviousDays.DateKey <= Day.DateKey) GROUP BY DateKey, EmployeeKey
DEFINE Totals AS SELECT SUM(FactSales_SalesAmount) AS Total FROM SaleState GROUP BY ProductSubcategoryName; DEFINE Top5 AS SELECT ARB(Total) AS Total FROM Totals GROUP BY ProductSubcategoryName ORDER BY Total DESC PAGE(0,5); RETURN Chart AS SELECT COALESCE(Top5.ProductSubcategoryName, 'Other') AS Subcategory, SUM(Totals.Total) AS Total FROM Totals LEFT JOIN Top5 ON (Totals.ProductSubcategoryName = Top5.ProductSubcategoryName) GROUP BY Subcategory
DEFINE Product AS SELECT ProductAlternateKey AS Key, ARB(ProductName) AS Name FROM SaleState GROUP BY Key; DEFINE RegionTrans AS SELECT ProductAlternateKey AS ProductKey, FactSales_SalesAmount AS Amount FROM SaleState WHERE DimSalesTerritory_SalesTerritoryRegion='United Kingdom'; RETURN Results AS SELECT Product.Key AS ProductKey, ARB(Product.Name) AS ProductName, COALESCE(SUM(RegionTrans.Amount), 0) AS SalesTotal, COUNT(RegionTrans.Amount) AS TransactionCount FROM Product LEFT JOIN RegionTrans ON (Product.Key = RegionTrans.ProductKey) GROUP BY ProductKey
DEFINE TopEmployees AS SELECT DimEmployee_EmployeeKey AS Key, ARB(DimEmployee_FullName) AS Name, SUM(FactSales_SalesAmount) AS SalesTotal FROM SaleState GROUP BY Key ORDER BY SalesTotal DESC PAGE (0,10); DEFINE TopProducts AS SELECT ProductAlternateKey AS Key, ARB(ProductName) AS Name, SUM(FactSales_SalesAmount) AS SalesTotal FROM SaleState GROUP BY Key ORDER BY SalesTotal DESC PAGE (0,10); DEFINE EmployeeProductTotals AS SELECT DimEmployee_EmployeeKey AS EmployeeKey, ProductAlternateKey AS ProductKey, SUM(FactSales_SalesAmount) AS SalesTotal FROM SaleState GROUP BY EmployeeKey, ProductKey HAVING [EmployeeKey] IN TopEmployees AND [ProductKey] IN TopProducts; RETURN Results AS SELECT TopEmployees.Key AS EmployeeKey, TopEmployees.Name AS EmployeeName, TopEmployees.SalesTotal AS EmployeeTotal, TopProducts.Key AS ProductKey, TopProducts.Name AS ProductName, TopProducts.SalesTotal AS ProductTotal, EmployeeProductTotals.SalesTotal AS EmployeeProductTotal FROM EmployeeProductTotals FULL JOIN TopEmployees ON (EmployeeProductTotals.EmployeeKey = TopEmployees.Key) FULL JOIN TopProducts ON (EmployeeProductTotals.ProductKey = TopProducts.Key)
DEFINE GlobalTotal AS SELECT SUM(FactSales_SalesAmount) AS GlobalTotal FROM SaleState GROUP; DEFINE SubcategoryTotals AS SELECT SUM(FactSales_SalesAmount) AS SubcategoryTotal FROM SaleState GROUP BY ProductSubcategoryName; RETURN SubcategoryContributions AS SELECT SubcategoryTotals.ProductSubcategoryName AS Subcategory, SubcategoryTotals.SubcategoryTotal / GlobalTotal.GlobalTotal AS Contribution FROM SubcategoryTotals CROSS JOIN GlobalTotal