如何在不省略父级的情况下返回父级及其子级?

时间:2017-09-21 12:33:19

标签: sql oracle11g

我对SQL没有超级经验,所以这可能是一个非常简单的解决方案。但是,我遇到了很多麻烦。我无法想出一个完全类似的现实世界的情况,所以我将逐字解释。

我有一个表(CGI_SUB)有2列:SUB和CGI。为了便于描述,我们给表别名“a”。此表中没有唯一键。每个CGI条目(“父级”)都有一个相应的SUB条目。它接近于说CGI = Parent和SUB是从关系角度看的子级;但是,每个父级也将具有相同的SUB。

我想要做的是输出所有CGI(包括“父”),如果它有孩子(总共2个或更多个SUB)。实质上,只有在有了孩子的情况下才能输出父母及其子女。

表格如下

| SUB | CGI  |
______________
| TTA | TTA  |
| NSN | NSN  |
| INF | NSN  |
| VWA | VWA  |
| POR | VWA  |
| BMW | BMW  |

你可以看到,在这种情况下,NSN和VWA有“孩子”而TTA和宝马没有。所以,我想输出NSN,VWA和他们的孩子:

| SUB |
_______
| NSN |
| INF |
| VWA |
| POR |

感谢您的帮助!

克雷格

编辑:拼写

3 个答案:

答案 0 :(得分:2)

从x选择a.sub内连接x b其中(a.sub<> b.sub和a.cpi = b.cpi);

答案 1 :(得分:0)

如果你只有两个级别,那么分层方法可能会有点过分;因此,一种方法是使用exists子句来检查不匹配的父/子记录:

select a.sub
from cgi_sub a
where exists (
  select null from cgi_sub b where b.cgi = a.cgi and b.sub != b.cgi
);

这将排除那些没有(也)一行的cgi行与sub不匹配的行。

将您的样本作为CTE:

with cgi_sub (sub, cgi) as (
  select 'TTA', 'TTA' from dual
  union all select 'NSN', 'NSN' from dual
  union all select 'INF', 'NSN' from dual
  union all select 'VWA', 'VWA' from dual
  union all select 'POR', 'VWA' from dual
  union all select 'BMW', 'BMW' from dual
)
select a.sub
from cgi_sub a
where exists (
  select null from cgi_sub b where b.cgi = a.cgi and b.sub != b.cgi
);

SUB
---
INF
NSN
POR
VWA

答案 2 :(得分:0)

@Vani的回应让我走上正轨。 这就是我最终完成的工作

  Select Distinct(a.sub) FROM CGI_SUB a
  INNER JOIN CGI_SUB b
    ON b.cgi = a.cgi
  WHERE (a.sub <> b.sub AND a.CGI = b.CGI)