SQLServer(2012)在WHERE或ON AND中的Left Join条件

时间:2014-06-11 16:59:39

标签: sql sql-server date left-join where

我有两个包含客户端ID的表。一个表( TABLE_B )包含合同和服务信息客户端法术,另一个表( TABLE_A )包含学校出勤信息客户评估。两个表都包含重复的客户端ID,并且仅由拼写和评估ID区分。并非TABLE_B中的所有客户端都在TABLE_A中,但TABLE_A中的所有客户端都在TABLE_B中。

我希望查询生成一个列出所有客户端(来自TABLE_B)的数据集,并在评估日期落入拼写打开和关闭日期时加入。并非所有法术都已关闭。

下面的查询失败,因为它不包含所有客户端记录 - 在TABLE_A中找不到客户端ID的记录被省略,并且数据集不包含TABLE_B中的所有客户端IDS。我该如何解决这个问题?

SELECT
      B.[Agency]
      ,B.[Contract#]
      ,B.[total spells]
      ,B.[spell open date]
      ,B.[spell close date]
      ,B.[spell ID]
      ,B.[Class Level]
      ,B.[Spec Pop]
      ,B.[client_id] 
      ,A.[client_id] 
      ,A.[e_due_date]
      ,A.[scheduled]
      ,A.[attended]

FROM [PAK].[dbo].[TABLE_B] B 

LEFT JOIN [PAK].[dbo].[[TABLE_A] A ON A.[client_id]=B.[client_id]

WHERE  A.[e_due_date]>=B.[spell open date] AND (A.[e_due_date]<=B.[spell close date] OR B.[spell close date] IS NULL)

1 个答案:

答案 0 :(得分:4)

问题是,当您在左连接条件之外应用LEFT JOIN逻辑时,您将INNER JOIN变为WHERE。您需要将WHERE更改为AND,然后才能生效。

JOIN逻辑将创建您的WHERE逻辑适用的数据集,因此WHERE逻辑中将过滤掉NULL值的任何限制都将删除该行你的最终结果。如果您符合LEFT JOIN条件,那么它将仅适用于行结果中是否包含右侧数据,或者它是否为空。