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
要求更多的单词..忽略..
答案 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
所以你
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,并且将会发生)。