【问题标题】:SQLServer (2012) Left Join conditions in WHERE or ON ANDSQLServer (2012) 在 WHERE 或 ON AND 中的左连接条件
【发布时间】:2014-06-11 16:59:39
【问题描述】:

我有两个包含客户 ID 的表。一个表 (TABLE_B) 包含合同和服务信息,如 Spells for clients,另一个表 (TABLE_A) 包含学校出勤信息,如 对客户的评估。两个表都包含重复的客户端 ID,并且仅通过拼写和评估 ID 不同。并非 TABLE_B 中的所有客户端都在 TABLE_A 中,但 TABLE_A 中的所有客户端都在 TABLE_B 中。

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

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

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)

【问题讨论】:

  • WHERE 语句的第一部分通过要求 B 中的值过滤掉第二个表中的任何非空记录。[拼写打开日期]
  • 添加 OR B.[spell open date] IS NULL 可以解决这个问题吗?

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


【解决方案1】:

问题在于,当您在左联接条件之外应用 WHERE 逻辑时,您会将 LEFT JOIN 转换为 INNER JOIN。您需要将您的WHERE 更改为AND,它会起作用。

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

【讨论】:

  • 非常感谢。通过使用 AND 使其成为 LEFT JOIN 的一部分,它可以正常工作(一旦我添加了大量括号!)
猜你喜欢
  • 2015-11-25
  • 2015-05-02
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多