查询用相应字段的值替换一个字段

时间:2016-03-10 10:11:23

标签: mysql sql database oracle

我有一张名为 emp 的表格:

╔════╦══════╦═══════════╗
║ id ║ name ║ fathersid ║
╠════╬══════╬═══════════╣
║  1 ║  a   ║    2      ║
║  2 ║  s   ║   null    ║
║  3 ║  d   ║    1      ║
║  4 ║  f   ║    3      ║
╚════╩══════╩═══════════╝

我想打印与其父亲姓名对应的名字。

我写了以下查询:

SELECT name,
    (SELECT name FROM emp WHERE father_id = id)
FROM emp

这是对的吗?

如果没有,那么正确答案是什么?

3 个答案:

答案 0 :(得分:2)

我更喜欢使用自联接解决此类问题:

SELECT e1.name AS name, COALESCE(e2.name, 'Not Available') AS fatherName
FROM emp e1 LEFT JOIN emp e2
    ON e1.fathersid = e2.id

答案 1 :(得分:1)

它几乎是正确的,您需要对表进行别名,以便读者知道您正在将内部查询与外部查询进行比较:

SELECT t.NAME,
       (SELECT s.name FROM emp s where s.id = t.father_id) as Father_name
FROM emp t

您可以通过加入来执行此操作:

SELECT t.name,s.name as Father_Name
FROM emp t
LEFT OUTER JOIN emp s
 ON(t.father_id = s.id)

答案 2 :(得分:1)

在Oracle中,您可以使用分层查询(仅需要单个表扫描 - 与使用需要多个表扫描的连接或相关子查询相比):

SELECT name,
       PRIOR name AS fathers_name
FROM   emp
START WITH       fathersid = NULL
CONNECT BY PRIOR empno = fathersid;