2017-09-21 59 views
0

我不是超级有经验的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和他们的小孩dren:

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

感谢您的帮助!

克雷格

编辑:拼写

回答

2

选择a.sub加入X B,其中(a.sub <> b.sub和a.cpi = b.cpi);

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:从X A内

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 
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) 
相关问题