Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 完全外部联接不会在右侧获取空值,而左侧确实存在空值_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 完全外部联接不会在右侧获取空值,而左侧确实存在空值

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

我必须比较两个来源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 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,则不会显示该行。