关于自联接的小问题

时间:2017-07-02 16:22:59

标签: sql oracle

我有一个表EMP,其列如下:

onSubmit(db: AngularFireDatabase ) {
        console.log("New Task",this.newTask);

        this.todosEdit.subscribe(snapshots=> {
            snapshots.forEach(snapshot => {
                if(snapshot.val().id){
                    this.todoListHighestId = snapshot.val().id;
                    //console.log("this.todoListHighestId",this.todoListHighestId, snapshot.val().id)
                }
                else {
                    this.todoListHighestId = 10;
                }
            });
        });
        this.finalObject = {
            'id' : this.todoListHighestId+1,
            'title' : this.newTask.title,
            'description' :this.newTask.description,
            'status':true,
            'completed' :false,
            'userID':this.newTask.userID
        };
        this.todosEdit.subscribe(todosData=>{
            console.log("todosData ",todosData);
        })
        //push(this.finalObject);

        console.log("final OBject",this.finalObject);
        this.newTask = new todo();
        /* To reset the form*/
            this.active=false;
            setTimeout ( ()=> this.active=true,0);
        /* To reset the form*/
    }

我想列出所有员工的姓名及其经理姓名,包括那些没有经理的人。对于这些员工,他们的经理姓名应显示为“BOSS”。

3 个答案:

答案 0 :(得分:2)

以下查询应该有效:

select e.ename, (case when m.ename is null then 'BOSS' else m.ename end) as mgrName 
from emp e
left join emp m on m.empno = e.mgr_id

答案 1 :(得分:2)

在我看来,Charanjith提出了更好的解决方案。

在Oracle中,我们甚至可以使用NVL函数而不是“case when”来替换null值。结果应该是一样的。

select e.ename empName, NVL(m.ename, 'BOSS') mgrName from emp e
left join emp m on m.empno = e.mgr_id

此外,我们可以看到另一种解决方案:当管理器存在时,使用内部联接来过滤emp。然后为所有没有经理的员工加入工会。

select e.ename empName, m.ename mgrName from emp e inner join emp m on e.mgr_id = m.empno
union
select e.ename empName, 'BOSS' mgrName from emp e where not exists (select 1 from emp m where e.mgr_id = m.empno)

答案 2 :(得分:0)

这在oracle中工作正常:

SELECT e.ename,
 nvl(m.ename, 'BOSS')mgr
   FROM emp a
LEFT JOIN emp b
ON m.empno = e.mgr_id;