因此,这里是你的测试数据:
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关键字,这是破坏查询的最后一个手段。
来源
2011-05-11 18:25:36
APC
您需要详细说明。我已经多次阅读这个问题和你的例子,但仍然不知道你在问什么。什么是“儿童名单”?什么定义了这个孩子? – cmutt78 2011-05-11 18:14:42
grp#和父母#跟随子女 - 父母关系。 10是30的父亲,即30是10的孩子。所以如果我们查询id = 0和grp#= 10,我们需要返回30和US。如果我们查询id = 0和grp#= 30,我们需要返回NULL和SF。 – kate 2011-05-11 18:18:05