【问题标题】:Write a self join query?编写自联接查询?
【发布时间】:2013-07-02 04:47:42
【问题描述】:

我有下表的值

CREATE TABLE #tmpEmployee(ID int, EmpName varchar(50), EmpBossID int)

insert into #tmpEmployee values ( 1, 'Abhijit', 2);
insert into #tmpEmployee values ( 2, 'Haris', 3);
insert into #tmpEmployee values ( 3, 'Sanal', 0);

现在我希望结果如下

ID  EmpName BossName
1   Abhijit Haris
2   Haris   Sanal

所以我写了以下查询。

select E1.ID,E1.EmpName, E.EmpName as BossName from #tmpEmployee E inner join #tmpEmployee E1 on E1.EmpBossID=E.ID.

但问题是第三名员工(Sanal)没有老板。 所以我想要这个确切的结果:

ID  EmpName BossName
1   Abhijit Haris
2   Haris   Sanal
3   Sanal   Null

我该怎么办?

【问题讨论】:

  • inner join 替换为left outer join
  • select E1.ID,E1.EmpName, E.EmpName as BossName from #tmpEmployee E Left Outer join #tmpEmployee E1 on E1.EmpBossID=E.ID 尝试但结果变为 ID EmpName BossName NULL NULL Abhijit 1 阿比吉特哈里斯 2 哈里斯萨纳尔
  • 只需将其切换为 RIGHT 连接即可。
  • @Haris - 我对预期结果和您当前的陈述没有仔细研究,但关键是您应该查找innerouter 连接之间的区别。
  • 好的 Lieven Keersmaekers 感谢您的建议

标签: sql join


【解决方案1】:

使用右连接

 select E1.ID,E1.EmpName, E.EmpName as BossName from #tmpEmployee E right join #tmpEmployee E1 on E1.EmpBossID=E.ID

ID  EmpName BossName
1   Abhijit Haris
2   Haris   Sanal
3   Sanal   NULL

我觉得你没问题

【讨论】:

    【解决方案2】:

    使用LEFT JOIN 并颠倒表格的顺序:

    select
      E.ID,
      E.EmpName,
      B.EmpName as BossName
    from tmpEmployee E
    left join tmpEmployee B on E.EmpBossID = B.ID
    

    在 SQLFiddle 上查看此查询的 live demo

    把join的“employee”部分放在前面意味着所有的员工都被列出来了。

    使用left 连接意味着没有老板的员工(例如CEO)仍会被列出,但BossName 列将有一个null

    如果您确实希望仅列出有老板的员工,请将查询更改为简单的 JOIN 而不是 LEFT JOIN(请注意,默认联接类型是 INNER

    附言格式化您的查询也没有什么坏处:

    【讨论】:

    • 感谢您的建议。但是答案变得不正确,它得到的结果为 ID EmpName BossName 1 Abhijit NULL 2 Haris Abhijit 3 Sanal Haris
    • 糟糕!以错误的方式加入。我已经更新了查询和 sqlfiddle 链接。重命名表别名也使其更清晰。现在可以正常工作了
    【解决方案3】:

    试试这个...

    使用左连接..

    select E.ID,E.EmpName, E1.EmpName as BossName from #tmpEmployee E left outer join #tmpEmployee E1 on E1.EmpBossID=E.ID
    
    ID  EmpName BossName
    1   Abhijit Haris
    2   Haris   Sanal
    3   Sanal   NULL
    

    【讨论】:

    • 不,不正确。我得到答案成为 ID EmpName BossName NULL NULL Abhijit 1 Abhijit Haris 2 Haris Sanal
    • 不,那也得到了错误的答案。至少你确保发布 cmnt 是正确的
    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多