我有两个包含客户端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)
答案 0 :(得分:4)
问题是,当您在左连接条件之外应用LEFT JOIN
逻辑时,您将INNER JOIN
变为WHERE
。您需要将WHERE
更改为AND
,然后才能生效。
JOIN
逻辑将创建您的WHERE
逻辑适用的数据集,因此WHERE
逻辑中将过滤掉NULL
值的任何限制都将删除该行你的最终结果。如果您符合LEFT JOIN
条件,那么它将仅适用于行结果中是否包含右侧数据,或者它是否为空。