删除join语句中的空单元格

时间:2015-11-18 19:24:37

标签: mysql join null

A
|  num |   Bank   |
|   1  |   TD     |
|   2  |   BOA    |

B
|  num |   Bank   | Location |
|   1  |   TD     |    NY    |
|   2  |   BOA    |    CT    |

C
|  num |  Employee| Status |  Location |
|   1  |   John   |  Mgr   |    NY     |
|   2  |   Jacob  | Teller |    NY     |
|   3  |   Jenny  | Teller |    NY     |
|   4  |   Clark  |  Mgr   |    CT     |
|   5  |   Kent   | Teller |    CT     |


select 
a.num,
CASE
    WHEN c.status = 'Mgr' 
    Then C.employee,
CASE
    WHEN c.status = 'Teller' 
    Then C.employee,
c.location
FROM A
    JOIN B on a.num=b.num
    JOIN C on b.num=c.num

我试着找一张桌子,用两张单独的行显示雅各布和珍妮,约翰作为他们的经理,但它显示为:

a.num | Mgr | Employee|  Location
  1   | John|  null  |    NY
  2   | null|  Jacob |    NY
  3   | null|  Jenny |    NY

我喜欢这个:

a.num | Mgr | Employee|  Location
  2   | John|  Jacob  |    NY
  3   | John|  Jenny  |    NY

要求更多的单词..忽略..

1 个答案:

答案 0 :(得分:1)

您需要的是Self Join。基本上,您需要将表A(员工)链接到表A(mgr)。我现在无法访问MySQL,因此我的语法可能无效。如果错误只是告诉我并且我将修复它(或者如果您知道错误修复它并告诉我:P)

那你想要什么?您想要选择所有员工。

Select 
    employee.num as Num, 
    'managerName' as Manager, 
    employee.Employee as Emplooyee, 
    employee.location as Location
FROM 
    C as employee

但是,这意味着您还将拥有经理。所以你只想要那些不是经理的员工;您需要添加where employee.status !='Mgr'

这意味着您拥有所有员工的名单并需要经理。您如何找到经理,他是拥有status='Mgr'并且位于同一行num以及location

的员工(C)

所以你

LEFT JOIN 
    C as manager 
        ON manager.location = employee.location AND
        manager.status='Mgr'

这给你一个很好的清单:

Select 
    employee.num as Num, 
    manager.Employee as Manager, 
    employee.Employee as Employee, 
    employee.location as Location
FROM 
    C as employee
LEFT JOIN 
    C as manager 
        ON manager.location = employee.location AND
        manager.status='Mgr'
WHERE employee.status !='Mgr'

您也可以将WHERE子句删除到列表管理器,但这意味着您必须更改join子句,使其不能成为自己的管理器(因为这很奇怪)。同样,您也可以将[Cross]加入列出没有员工的经理,或者内部加入来过滤掉没有经理的员工(这将是shuldn​​' t,并且将会发生)。