2011-05-11 90 views
1

我已经在我的数据库表联接:帮助,亲子关系

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,它应该返回美国,30和ID = 0,GRP#= 30,它应该返回SF,NULL

注:不应该有重复在输出中。

+0

您需要详细说明。我已经多次阅读这个问题和你的例子,但仍然不知道你在问什么。什么是“儿童名单”?什么定义了这个孩子? – cmutt78 2011-05-11 18:14:42

+0

grp#和父母#跟随子女 - 父母关系。 10是30的父亲,即30是10的孩子。所以如果我们查询id = 0和grp#= 10,我们需要返回30和US。如果我们查询id = 0和grp#= 30,我们需要返回NULL和SF。 – kate 2011-05-11 18:18:05

回答

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关键字,这是破坏查询的最后一个手段。

+0

感谢您的快速回答。但正如您在第一个查询中看到的那样,您将获得两次输出。这是因为第二行的连接和c.id为1。我不想那样。我们可以重写查询来返回一行而不是重复吗? – kate 2011-05-11 18:32:55

+0

它看起来像连接条件应该是2列而不是一个。就像(c.parent#= p.grp#和c.id = p.id) – 2011-05-11 19:54:16

+0

@ToddPierce - 这也是我的猜测,但我们不应该猜测。这个问题应该有所有相关的细节。 – APC 2011-05-11 20:24:36