【问题标题】:Joins in sql not to consider for null in left outer joinsql中的连接不考虑左外连接中的null
【发布时间】:2020-03-22 16:48:03
【问题描述】:

employee表包含empCode (fk), empName etc

角色表包含roleCode (fk), roleName etc

employeeRoleMap表包含Many-To-Many of both (id, empCode, roleCode, isPrimaryRole etc)的数据

一个员工可以有多个角色,其中只有一个主要角色 (isPrimary = 1)

要显示员工详细信息和主要角色,我需要处理 employeeemployeeRoleMap

所以,查询

select em.empCode, em.empName, em.roleCode
FROM employee em 
left join employeeRoleMap erm 
    on (em.empCode=erm.empCode AND erm.isPrimary=1) 

对于哪个主要角色不存在,它将显示为空。好的。

但是,现在我想要添加角色详细信息字段,例如角色名称。

所以,我尝试了cross-join

select em.empCode, em.empName, em.roleCode
FROM employee em 
LEFT JOIN employeeRoleMap erm 
    on (em.empCode=erm.empCode AND erm.isPrimary=1) 
CROSS JOIN role r
WHERE em.roleCode = r.roleCode

它适用于拥有 roleCode 的人,对于拥有 null 作为主要角色代码的员工,这些行将被忽略。

但是,它不应该是这种情况,因为员工是左外连接,即使角色代码存在与否,它也应该显示

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    您可以使用 LEFT JOIN

    ,而不是使用 CROSS JOIN
    select em.empCode, em.empName, em.roleCode,r.RoleName
    FROM employee em 
    LEFT JOIN employeeRoleMap erm 
        on (em.empCode=erm.empCode AND erm.isPrimary=1) 
    LEFT JOIN role r ON em.roleCode = r.roleCode
    

    【讨论】:

      【解决方案2】:

      你可以试试

      Select em.empCode, em.empName, em.roleCode
           FROM employee em 
       LEFT JOIN employeeRoleMap erm 
           on (em.empCode=erm.empCode AND erm.isPrimary=1) 
       LEFT JOIN role r
          on em.roleCode = r.roleCode
      

      如果没有样本数据,很难知道这是否可行。

      【讨论】:

      • 是的,那只管用。我试图修复交叉连接,因为左连接只是给出了
      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2021-09-02
      • 2012-12-09
      • 1970-01-01
      相关资源
      最近更新 更多