帮助左外连接与父子关系

时间:2011-05-11 18:07:31

标签: oracle plsql outer-join

我的数据库中有以下表格:

id   grp#  code  parent#
--   ----  ----  -------
 0     10  US       NULL     
 0     30  SF         10 
 1     10  S        NULL 
 1     30  SF         10

由此,给定一个id和grp#我需要返回子项列表和grp#的代码。如果子元素不存在,则应返回NULL。

所以例如:对于id = 0,grp#= 10它应该返回US,30并且对于id = 0,grp#= 30它应该返回SF,NULL

注意:输出中不应有重复项。

1 个答案:

答案 0 :(得分:2)

所以这是你的测试数据:

SQL> select * from t42
  2  /

        ID       GRP# CODE                    PARENT#
---------- ---------- -------------------- ----------
         0         10 US
         0         30 SF                           10
         1         10 S
         1         30 SF                           10

SQL>

这是一个返回所需结果的查询:

SQL> select p.code
  2         , c.grp# as child_grp#
  3  from t42 p
  4       left outer join t42 c
  5        on ( c.parent# = p.grp# )
  6  where p.id = &id
  7  and p.grp# = &grp
  8  /
Enter value for id: 0
old   6: where p.id = &id
new   6: where p.id = 0
Enter value for grp: 10
old   7: and p.grp# = &grp
new   7: and p.grp# = 10

CODE                 CHILD_GRP#
-------------------- ----------
US                           30
US                           30

SQL> r
  1  select p.code
  2         , c.grp# as child_grp#
  3  from t42 p
  4       left outer join t42 c
  5        on ( c.parent# = p.grp# )
  6  where p.id = &id
  7* and p.grp# = &grp
Enter value for id: 0
old   6: where p.id = &id
new   6: where p.id = 0
Enter value for grp: 30
old   7: and p.grp# = &grp
new   7: and p.grp# = 30

CODE                 CHILD_GRP#
-------------------- ----------
SF

SQL>

  

“我们可以重写查询以返回单行而不是   重复?“

当然 - 前提是您可以指定其他业务规则。

简单的方法是部署DISTINCT关键字,这是破解查询的最后手段。