SQL在一个表中显示父子关系

时间:2015-10-08 21:56:51

标签: sql parent-child

我有一个名为result_seq的表,其中有3列

  • STEP_IDSTEP_PARENT(父级的ID)和STEP_NAME

我必须同时显示父名称和子名称,并且名称位于STEP_NAME列中。如:

STEP_ID     , STEP_PARENT , STEP_NAME; 
'{6ef83b76}', '{70207fe2}', 'Check ABC'

对于顶级STEP_IDSTEP_PARENT为空。

我目前正在使用select子句中的子查询

select 
    sq.STEP_ID,
    sq.STEP_PARENT,
    sq.step_name,
    (select sq1.step_name 
    from result_seq sq1, result_seq sq2 
    where sq1.step_id=sq2.step_parent) as 'parent_name'
from result_seq sq 

但由于某种原因,它说语法错误。我只是想知道其他人如何解决这个问题

非常感谢

2 个答案:

答案 0 :(得分:0)

您应该使用LEFT JOIN

 SELECT 
        C.STEP_ID     as Child_ID              
        C.STEP_PARENT as Parent_ID,
        C.STEP_NAME   as Child,
        P.STEP_NAME   as Parent
 FROM result_seq P
 LEFT JOIN result_seq C
   ON P.STEP_ID = C.STEP_PARENT

当您为子级使用更好的别名C和为父级使用P时,请查看更容易阅读。

如果你想修复你当前的查询。

select 
    C.STEP_ID,
    C.STEP_PARENT,
    C.step_name,
    (select P.step_name 
     from result_seq P
     where P.step_id = C.step_parent) as 'parent_name'
from result_seq C 

但是我不会推荐它,因为看起来会有较慢的性能。一如既往,最好的是尝试两种方式,并为自己寻找。

答案 1 :(得分:0)

你必须加入第一个result_sq和第二个,否则你将获得所有'parent_names'。这导致语法错误。

select 
    sq.STEP_ID,
    sq.STEP_PARENT,
    sq.step_name,
    (select sq2.step_name 
    from result_seq sq2 
    where sq2.step_id=sq.step_parent) as 'parent_name'
from result_seq sq 

或者你可以简单地使用'LEFT OUTER JOIN'

select 
    sq.STEP_ID,
    sq.STEP_PARENT,
    sq.step_name,
    sq1.STEP_NAME as 'parent_name'
from result_seq sq 
left join result_seq sq1 on sq.STEP_PARENT = sq1.STEP_ID