2017-09-21 3 views
0

私はSQLの経験が豊富ではないので、これはかなり簡単な解決策かもしれません。しかし、私はそれに多くの問題を抱えています。私は完全に類似した現実の状況を思い付くことができないので、そのままそのまま説明します。親を省略することなく親とその子を返す方法はありますか?

私は2つの列:SUBとCGIを持つテーブル(CGI_SUB)を持っています。説明を簡単にするために、テーブルのエイリアスに「a」を付けてください。このテーブルには一意のキーはありません。すべてのCGIエントリ( "親")には対応するSUBエントリがあります。これはCGI = Parentと似ていますが、SUBは関係の観点からは子ですが、各親も同じSUBを持ちます

やることは、子供(合計で2以上SUBの)を持っていれば、出力(「親」を含む)すべてのCGIです。要するに、彼らは子供を持っている場合にのみ、両親と子供たちを出力する。

表は、この

のように見えます
| SUB | CGI | 
______________ 
| TTA | TTA | 
| NSN | NSN | 
| INF | NSN | 
| VWA | VWA | 
| POR | VWA | 
| BMW | BMW | 

この場合、NSNとVWAには「子」があり、TTAとBMWではそうではないことがわかります。したがって、NSN、VWA、およびそれらのchil dren:

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

ありがとうございました!

クレイグ

編集:スペル

答えて

2

選択a.subインナーXからは、x B(<> b.sub a.subとa.cpi = b.cpi)に参加します。

0

あなたは2つのだけのレベルを持っている場合は、階層的なアプローチはおそらく行き過ぎだろう。したがって一つのアプローチは、非マッチング親/子レコードをチェックする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 
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) 
関連する問題