具有多个表的LEFT OUTER JOIN与NOT EXISTS语法

时间:2017-02-01 21:34:58

标签: syntax sql-server-2012 left-join ssrs-2012 not-exists

我正在对我的SSRS本机实例进行一些性能故障排除。我有我希望的简单语法问题。我在使用LEFT OUTER JOIN和NOT EXISTS时对执行计划进行故障排除。我知道两者之间的区别,并希望可能不是我的解决方案,但我有一个问题。这是我的查询。

SELECT [Facility]
  ,[CategoryDesc]
  ,[SubCategoryDesc]
  ,[ItemKey]
  ,[ItemDesc]
  ,[HeadCount]
  ,[Group]
  ,[Group Name]
  ,[CustomerKey]
  ,[Customer]
  ,[InvoiceNo]
  ,[InvoiceDate]
  ,[OrderNo]
  ,[OrderDate]
  ,[FiscalYear]
  ,[Quarter]
  ,[WeekNo]
  ,[SalesmanID]
  ,[Salesman]
  ,[ReasonCodeKey]
  ,[Weight]
  ,[Box]
  ,[Value]
  ,[OrderStatus]
  ,[PONumber]
  ,[SubCategoryKey]
  ,[DispatchCenterOrderKey]
  ,[PromotionFlag]
  ,[CategoryKey]
  ,b.UserID
FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a
LEFT OUTER JOIN [FinancialData].[dbo].[DimSalesRepUserIDMap] b on b.SalesRepID = a.SalesmanID

我希望改用它:

SELECT [Facility]
  ,[CategoryDesc]
  ,[SubCategoryDesc]
  ,[ItemKey]
  ,[ItemDesc]
  ,[HeadCount]
  ,[Group]
  ,[Group Name]
  ,[CustomerKey]
  ,[Customer]
  ,[InvoiceNo]
  ,[InvoiceDate]
  ,[OrderNo]
  ,[OrderDate]
  ,[FiscalYear]
  ,[Quarter]
  ,[WeekNo]
  ,[SalesmanID]
  ,[Salesman]
  ,[ReasonCodeKey]
  ,[Weight]
  ,[Box]
  ,[Value]
  ,[OrderStatus]
  ,[PONumber]
  ,[SubCategoryKey]
  ,[DispatchCenterOrderKey]
  ,[PromotionFlag]
  ,[CategoryKey]
  ,b.UserID
  FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a
  WHERE NOT EXISTS (SELECT 1 FROM FinancialData.dbo.DimSalesRepUserIDMap b WHERE b.SalesRepID = a.SalesmanID)

问题是最后一列“b.UserID”使用LEFT OUTER JOIN来获取它的别名。当使用最后一个查询时,我得到“多部分标识符”b.UserID“无法绑定。显然这是因为我已经删除了对该表的调用。如果我这样包含它...它需要很远太久而不是我期待收到的。

 FROM [FinancialData].[dbo].[FactSalesHistoryDetail] a,     FinancialData.dbo.DimSalesRepUserIDMap b
 WHERE NOT EXISTS (SELECT 1 FROM FinancialData.dbo.DimSalesRepUserIDMap b WHERE b.SalesRepID = a.SalesmanID)

所以问题是我如何格式化这个以便我使用NOT EXISTS或EXISTS优化性能,同时还引用其他表中的多个列?

1 个答案:

答案 0 :(得分:0)

左连接是此时的最佳选择。最后一个查询将产生结果但会对性能产生影响。顺便问一下,你试过交叉加入吗?