Sql 完全外部联接不会在右侧获取空值,而左侧确实存在空值
我必须比较两个来源EmployeeODS和EmployeeDWH,以获得新的或删除的记录,如下所示:Sql 完全外部联接不会在右侧获取空值,而左侧确实存在空值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我必须比较两个来源EmployeeODS和EmployeeDWH,以获得新的或删除的记录,如下所示: SELECT bf.EmployeeId AS EmployeeIdODS ,bf.FunctionId AS FunctionIdODS ,bf.Scope AS ScopeODS ,bf.Primacy AS PrimacyODS ,bn.EmployeeId AS EmployeeIdDWH ,bn.FunctionId AS F
SELECT bf.EmployeeId AS EmployeeIdODS
,bf.FunctionId AS FunctionIdODS
,bf.Scope AS ScopeODS
,bf.Primacy AS PrimacyODS
,bn.EmployeeId AS EmployeeIdDWH
,bn.FunctionId AS FunctionIdDWH
,bn.Scope AS ScopeDWH
,bn.Primacy AS PrimacyDWH
,bn.BI_StartDate
,bn.BI_EndDate
FROM EmployeeODS bf
FULL OUTER JOIN EmployeeDWH bn ON bf.EmployeeId = bn.EmployeeId
AND bf.FunctionId=bn.FunctionId
AND bf.Scope=bn.Scope
WHERE bf.EmployeeId=15366
输出如下所示:
EmployeeIdODS FunctionIdODS ScopeODS PrimacyODS EmployeeIdDWH FunctionIdDWH ScopeDWH PrimacyDWH BI_StartDate BI_EndDate
15366 45 AMAGR 2 15366 45 AMAGR 2 2020-03-25 9999-12-31
15366 940 AMATUN 1 15366 940 AMATUN 1 2020-03-25 9999-12-31
当我从EmployeeODS中删除具有函数IDODS=45和ScopeODS='AMAGR'的记录时:
DELETE FROM EmployeeODS WHERE EmployeeId=15366 AND Scope='AMAGR' AND FunctionId=45
我得到以下输出:
EmployeeIdODS FunctionIdODS ScopeODS PrimacyODS EmployeeIdDWH FunctionIdDWH ScopeDWH PrimacyDWH BI_StartDate BI_EndDate
15366 940 AMATUN 1 15366 940 AMATUN 1 2020-03-25 9999-12-31
EmployeeIdODS FunctionIdODS ScopeODS PrimacyODS EmployeeIdDWH FunctionIdDWH ScopeDWH PrimacyDWH BI_StartDate BI_EndDate
NULL NULL NULL NULL 15366 45 AMAGR 2 2020-03-25 9999-12-31
15366 940 AMATUN 1 15366 940 AMATUN 1 2020-03-25 9999-12-31
我的预期产出:
EmployeeIdODS FunctionIdODS ScopeODS PrimacyODS EmployeeIdDWH FunctionIdDWH ScopeDWH PrimacyDWH BI_StartDate BI_EndDate
15366 940 AMATUN 1 15366 940 AMATUN 1 2020-03-25 9999-12-31
EmployeeIdODS FunctionIdODS ScopeODS PrimacyODS EmployeeIdDWH FunctionIdDWH ScopeDWH PrimacyDWH BI_StartDate BI_EndDate
NULL NULL NULL NULL 15366 45 AMAGR 2 2020-03-25 9999-12-31
15366 940 AMATUN 1 15366 940 AMATUN 1 2020-03-25 9999-12-31
WHERE子句将完全联接转换为较小类型的外部联接
对于完全联接,我建议在子查询中进行筛选:
FROM (SELECT bf.*
FROM EmployeeODS bf
WHERE bf.EmployeeId = 15366
) FULL JOIN
(SELECT bn.*
FROM EmployeeDWH bn
WHERE bn.EmployeeId = 15366
) bn
ON bf.EmployeeId = bn.EmployeeId AND
bf.FunctionId = bn.FunctionId AND
bf.Scope = bn.Scope
其中bf.EmployeeId=15366这意味着bf.EmployeeId不能为null,其中仍然需要为true。如果bf.EmployeeId=15366的计算结果不为true,则不会显示该行。