Django order_by导致LEFT JOIN

Al *_*l W 7 sql django django-models django-orm

谁能告诉我,为什么当我加入order_by()那得到的输出变化从查询INNER JOINLEFT OUTER JOIN

有什么方法可以保留INNER JOIN- 性吗?

data = models.RetailSalesFact.objects.values('customer_key__customer_state', 
                                             'date_key__calendar_month_name')
data = data.filter(date_key__calendar_year=year)
data = data.annotate(sales=Sum('sales_quantity'))
data = data.order_by('date_key__calendar_month_name')
Run Code Online (Sandbox Code Playgroud)

之前:

SELECT Customer_Dimension.Customer_State, Date_Dimension.Calendar_Month_Name,
       SUM(Retail_Sales_Fact.Sales_Quantity) AS sales 
    FROM Retail_Sales_Fact  
    INNER JOIN Customer_Dimension 
        ON (Retail_Sales_Fact.Customer_Key = Customer_Dimension.Customer_Key) 
    INNER JOIN Date_Dimension 
        ON (Retail_Sales_Fact.Date_Key = Date_Dimension.Date_Key) 
    WHERE Date_Dimension.Calendar_Year = ?  
    GROUP BY Customer_Dimension.Customer_State, 
             Date_Dimension.Calendar_Month_Name 
    ORDER BY Date_Dimension.Calendar_Month_Name ASC
Run Code Online (Sandbox Code Playgroud)

后:

SELECT Customer_Dimension.Customer_State, Date_Dimension.Calendar_Month_Name, 
       SUM(Retail_Sales_Fact.Sales_Quantity) AS sales 
    FROM Retail_Sales_Fact 
    INNER JOIN Customer_Dimension 
        ON (Retail_Sales_Fact.Customer_Key = Customer_Dimension.Customer_Key) 
    LEFT OUTER JOIN Date_Dimension 
        ON (Retail_Sales_Fact.Date_Key = Date_Dimension.Date_Key) 
    WHERE Date_Dimension.Calendar_Year = ?  
    GROUP BY Customer_Dimension.Customer_State, 
             Date_Dimension.Calendar_Month_Name 
    ORDER BY Date_Dimension.Calendar_Month_Name ASC
Run Code Online (Sandbox Code Playgroud)

Leo*_*opd 1

我猜测 ORM 正在执行 a ,LEFT JOIN因为它无法判断INNER JOIN's where 限制是否比排序子句更具限制性或更少限制性。因为它认为需要对每条记录进行排序,无论它是否匹配。

INNER JOIN您可以使用原始 SQL强制执行。order_by或者也许你可以通过在 之前应用 来欺骗 ORM filter