我有一张名为 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
这是对的吗?
如果没有,那么正确答案是什么?
答案 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;